FastAPI使用add_exception_handler时traceback.format_exc返回None
问题根因
traceback.format_exc()的工作逻辑是读取当前执行线程中活跃的异常上下文栈信息,FastAPI在捕获路由抛出的异常、转发到自定义异常处理器前,已经退出了原始异常的except上下文块,此时调用无参的format_exc()拿不到有效异常上下文,就会返回None。
修复方法
完整的异常栈信息已经绑定在传入异常处理器的exc参数对象上,不需要从当前上下文读取,改用traceback.format_exception()从异常对象提取完整栈追踪即可。
修正后的exception_handler.py代码如下:
from fastapi.responses import JSONResponse from fastapi import status from fastapi import Request import traceback def general_exception_handler(req: Request, exc: Exception): ''' 未捕获通用异常处理器 ''' # 从异常对象提取完整格式化栈追踪 tracback_msg = "".join( traceback.format_exception(type(exc), exc, exc.__traceback__) ) return JSONResponse( { "code": status.HTTP_500_INTERNAL_SERVER_ERROR, "message": f"error info: {tracback_msg}", "data": "", }, status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, )
server.py的异常处理器绑定逻辑不需要改动,重启服务后触发异常即可在接口响应中拿到完整栈信息。
注意事项
- 安全提醒:完整traceback会暴露服务端文件路径、依赖版本、代码逻辑片段等敏感信息,生产环境不建议直接透传给前端,可将栈信息写入服务端日志,接口仅返回通用错误提示。
- Python 3.10及以上版本可简化写法,直接调用
"".join(traceback.format_exception(exc))即可拿到相同结果,不需要手动传入异常类型和traceback对象。
内容的提问来源于stack exchange,提问作者IMAPOTATO
相关产品推荐
相关产品推荐

