获取完整的异常类型/消息和堆栈跟踪

Bas*_*sic 6 python exception python-3.x

我编写了一个以下列格式返回Json的API ...

{"Success": true, Result: {...}}

{"Success": false, ExceptionId: "(some uuid)"}
Run Code Online (Sandbox Code Playgroud)

记录例外.这原则很好,允许某人在没有告诉他们它是什么的情况下讨论错误(作为安全措施).在调试期间,我还想输出错误消息,以阻止我不得不一直引用数据库.

事实上,问题是从异常中获取有用信息(返回或登录数据库)

我正在做这样的事......

try:
    Ret['Result'] = <Blah>
    Ret['Success'] = True
except Exception as e:
    # ... Logging/ExceptionId
    if Settings.DebugMode: 
        Ret['Exception'] = str(e)
Run Code Online (Sandbox Code Playgroud)

如果我在最后一行放置一个断点并e在eclipse的监视窗口中检查,我得到了KeyError: 'Something',但str(e)结果'Something'是非常无益的.

我用谷歌搜索,我找不到任何方法从异常中获取正确的消息.显然曾经有.message过v <2.4但在3.3中对我毫无帮助

作为替代方案,我尝试过:

Ret['Exception'] = str(type(e)) + ": " + str(e)
Run Code Online (Sandbox Code Playgroud)

这导致<class 'KeyError'>: 'job'了更近一点,但它开始感觉越来越hackish.

我也希望包含一个堆栈跟踪但在那里运气更少 - 我可以得到__traceback__但当然它不可序列化并且调用str()它只会导致对象的描述,例如<traceback object at 0x0000000004024E48>

如何获得体面/全面的错误消息?

eca*_*mur 9

你可能想要repr:

Ret['Exception'] = repr(e)
Run Code Online (Sandbox Code Playgroud)

对于回溯,请使用traceback模块:

from traceback import format_exc
Ret['Traceback'] = format_exc()
Run Code Online (Sandbox Code Playgroud)