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

如何捕获Python脚本运行时的任意错误并触发自定义处理函数

Python全局异常自动触发自定义函数的实现方法

你可以通过注册全局异常钩子的方式实现该需求,不需要给所有代码块套try/except,所有未被显式捕获的异常都会自动触发你指定的逻辑:

1. 常规单线程场景:使用sys.excepthook

这是最常用的全局异常捕获方案,示例代码如下:

import sys

# 自定义错误处理函数,三个参数分别为异常类型、异常值、异常栈信息
def custom_error_handler(exc_type, exc_value, exc_traceback):
    # 这里写你要触发的自定义逻辑,比如给用户的提示
    print("*运行出错了,请检查你的操作或联系管理员处理*")
    # 如果你需要保留控制台默认的错误堆栈打印,加上下面这行即可
    sys.__excepthook__(exc_type, exc_value, exc_traceback)

# 注册钩子,将全局异常处理逻辑替换为你自定义的函数
sys.excepthook = custom_error_handler

# 测试用例:触发未捕获的除零错误
# 运行后会先打印你定义的提示,再输出默认的错误栈
1 / 0

2. 多线程场景:使用threading.excepthook

sys.excepthook默认无法捕获子线程抛出的未处理异常,如果你用到了多线程,Python 3.8及以上版本可以使用threading.excepthook实现子线程异常的全局捕获:

import threading
import sys

def thread_error_handler(args):
    print("*子线程运行发生错误*")
    # 保留默认的错误输出
    sys.__excepthook__(args.exc_type, args.exc_value, args.exc_traceback)

threading.excepthook = thread_error_handler

# 测试子线程异常
def error_task():
    1 / 0

t = threading.Thread(target=error_task)
t.start()
t.join()

3. 异步代码场景:使用asyncio的异常处理器

如果你用了asyncio写异步代码,可以给事件循环设置自定义异常处理器:

import asyncio

def async_error_handler(loop, context):
    print("*异步任务运行发生错误*")
    # 保留默认的错误处理逻辑
    loop.default_exception_handler(context)

loop = asyncio.get_event_loop()
loop.set_exception_handler(async_error_handler)

# 测试异步异常
async def error_task():
    1 / 0

loop.run_until_complete(error_task())

注意事项

  • 已经被try/except显式捕获且没有重新抛出的异常,不会触发全局异常钩子,属于正常逻辑
  • 你可以在自定义处理函数中添加任意逻辑,比如日志上报、错误现场存储、用户弹窗提示等

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 02:27:02