为何backtrace.hook搭配traceback.print_exc()无法输出彩色异常栈?
问题原因
backtrace.hook()本质是替换了Python解释器默认的全局未捕获异常处理逻辑,只有异常没有被手动捕获、向上冒泡到顶层的时候才会触发它的着色打印逻辑。你手动捕获异常后调用的traceback.print_exc()是原生traceback库的无着色实现,自然不会输出彩色内容。
解决方法
直接使用backtrace库自带的兼容接口替换原生traceback的打印调用即可,有两种常用写法:
写法1:直接用backtrace的print_exc接口
backtrace库提供了和原生traceback完全兼容的print_exc方法,直接替换调用就行:
#!/bin/python3 import backtrace import traceback backtrace.hook() try: raise Exception('here') except Exception: # 把 traceback.print_exc() 换成下面这句 backtrace.print_exc()
写法2:获取带颜色的异常栈字符串自行处理
如果你需要先拿到异常栈内容做二次处理再输出,可以用backtrace.format_exc()方法:
#!/bin/python3 import backtrace import traceback backtrace.hook() try: raise Exception('here') except Exception: # 拿到带颜色的异常栈字符串 colored_trace = backtrace.format_exc() # 可以做自定义处理之后再打印 print(colored_trace)
额外说明
如果需要同时保留原生traceback的其他能力,也不需要额外做适配,backtrace的上述接口和原生traceback的参数完全兼容,直接替换调用即可正常工作。
内容的提问来源于stack exchange,提问作者9mjb
相关产品推荐
相关产品推荐

