如何捕获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
相关产品推荐
相关产品推荐

