You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Python脚本在sys.excepthook处理后持续运行?

解决自定义错误处理器后脚本仍退出的问题

嘿,我来帮你搞定这个问题!你遇到的情况其实是因为sys.excepthook的作用和你预期的不一样——它只是用来自定义未捕获异常的输出内容,但Python在调用这个钩子之后,依然会终止程序,这是语言的默认行为。要实现“处理错误后继续运行”,得换几种思路来做:

方案一:用try-except直接包裹风险代码(最推荐)

这是最直观也最可控的方式,把可能出错的代码放在try块里,捕获异常后处理,然后脚本自然会继续执行后面的逻辑。

示例代码:

import traceback

def risky_operation():
    # 模拟可能出错的代码
    1 / 0

# 包裹风险代码
try:
    risky_operation()
except Exception as e:
    # 自定义错误输出
    print(f"{type(e).__name__} / {str(e)} / {traceback.extract_tb(e.__traceback__)}")
    print("Traceback was handled, script will continue working!")

# 后面的代码不受异常影响,会正常执行
print("Continuing with the rest of the script...")

方案二:用装饰器批量处理函数异常

如果你有多个函数需要处理异常,可以写一个装饰器,自动为函数添加异常捕获逻辑,这样每个函数出错后,程序都不会终止。

示例代码:

import traceback
from functools import wraps

# 定义捕获异常的装饰器
def catch_and_continue(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except Exception as e:
            print(f"{type(e).__name__} / {str(e)} / {traceback.extract_tb(e.__traceback__)}")
            print(f"Error in {func.__name__} handled, script keeps going!")
    return wrapper

# 给需要处理的函数加装饰器
@catch_and_continue
def risky_func1():
    1 / 0

@catch_and_continue
def risky_func2():
    print("Running after risky_func1 error...")
    int("not_a_number")

# 调用函数,出错后不会终止程序
risky_func1()
risky_func2()

print("All functions processed, script ends normally!")

方案三:全局捕获主线程异常(适合复杂场景)

如果你想让整个脚本在任何未捕获异常后都能继续运行,可以把主逻辑拆分成步骤,逐个用try-except包裹,出错后直接跳过当前步骤执行下一个。

示例代码:

import traceback

def main_step1():
    print("Executing step 1...")
    1 / 0  # 模拟错误

def main_step2():
    print("Executing step 2...")
    print("This step runs even if step 1 failed!")

if __name__ == "__main__":
    steps = [main_step1, main_step2]
    for step in steps:
        try:
            step()
        except Exception as e:
            print(f"{type(e).__name__} / {str(e)} / {traceback.extract_tb(e.__traceback__)}")
            print(f"Error in {step.__name__} handled, moving to next step!")

为什么你的sys.excepthook代码没用?

再解释下:sys.excepthook是Python用来处理未被任何try-except捕获的异常的回调函数,它的作用是让你自定义错误的输出格式,但Python在调用完这个钩子后,还是会终止程序——这是语言的设计逻辑,因为未捕获的异常意味着程序进入了不可预期的状态,默认会终止以避免更严重的问题。

所以如果你想让脚本继续运行,核心是确保异常被捕获,而不是只靠sys.excepthook来处理。

内容的提问来源于stack exchange,提问作者Jack Glow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:30:54