Python 3.12中如何用sys.last_exc调用sys.excepthook?
问题
sys.excepthook的签名为:
sys.excepthook(type, value, traceback)
此前常规调用方式是:
sys.excepthook(sys.exc_type, sys.exc_value, sys.exc_traceback)
但Python 3.12起,sys.exc_type、sys.exc_value、sys.exc_traceback已被弃用,转而使用sys.last_exc。已知可以用type(last_exc)作为第一个参数,last_exc作为第二个参数,但不清楚第三个参数traceback该如何获取。此问题源于更新Hy的异常过滤逻辑。
解决方案
直接通过异常实例的__traceback__属性获取回溯信息即可,这和之前sys.exc_traceback指向的是同一个对象。完整的调用代码如下:
import sys if sys.last_exc is not None: sys.excepthook(type(sys.last_exc), sys.last_exc, sys.last_exc.__traceback__)
需要注意两点:
sys.last_exc可能为None(比如当前没有未处理的异常时),调用前要先做非空判断,避免触发AttributeError。- 异常实例的
__traceback__是Python 3引入的标准属性,在try/except块中捕获异常时,也可以通过exc.__traceback__获取对应的回溯栈。
内容的提问来源于stack exchange,提问作者Kodiologist
相关产品推荐
相关产品推荐

