Python AttributeError: 'traceback'对象无format_exception属性排查
报错:AttributeError: 'traceback' object has no attribute 'format_exception'
复现场景
自定义全局异常钩子sys.excepthook时触发该报错,复现代码如下:
import sys def my_excepthook(exc_type, exc_value, exc_traceback): print(exc_traceback.format_exception()) sys.excepthook = my_excepthook x = 5/0
运行代码触发ZeroDivisionError时,不会正常打印除零错误,反而抛出上述属性错误。调试可确认传入的exc_traceback为traceback类型对象,仅包含tb_frame、tb_lasti、tb_lineno、tb_next四个属性,无内置方法。
问题原因
format_exception不是traceback实例对象的内置方法,它是Python标准库traceback模块提供的工具函数,二者命名相同但属于完全不同的范畴:
- 传入
excepthook的traceback对象:是栈回溯元数据的存储实例,仅记录异常发生时的调用栈位置、帧信息等原始数据,没有内置格式化相关方法 traceback模块的format_exception:是独立的格式化工具函数,接收异常类型、异常值、traceback对象三个入参,返回格式化后的异常文本列表
修复方法
先导入traceback标准库,调用模块下的format_exception方法并传入三个对应参数即可,修复后代码:
import sys import traceback def my_excepthook(exc_type, exc_value, exc_traceback): # 拼接格式化后的异常文本列表,输出和默认异常打印一致的内容 print(''.join(traceback.format_exception(exc_type, exc_value, exc_traceback))) sys.excepthook = my_excepthook x = 5/0
如果不需要自定义异常输出的拼接逻辑,也可以直接调用traceback.print_exception(exc_type, exc_value, exc_traceback),直接打印标准格式的异常栈,无需手动拼接字符串。
内容的提问来源于stack exchange,提问作者hydrated_showdown
相关产品推荐
相关产品推荐

