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

10
我编写了一个API,该API以以下格式返回Json...
{"Success": true, Result: {...}}

{"Success": false, ExceptionId: "(some uuid)"}

异常已记录。原则上,这对于允许某人讨论错误,而不向他们透露其内容(作为一种安全措施)是很好的。在调试期间,我还想输出错误消息,以免让我一直参考数据库。

目前的问题是如何从异常中获取有用信息(无论是返回或记录在数据库中)

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

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

如果我在最后一行设置断点并在eclipse的watch窗口中检查e,我会得到KeyError: 'Something',但是str(e)的结果是'Something',这非常不方便。
我已经搜索过了,但是找不到从异常中获取正确消息的方法。显然,在v<2.4中有一个.message,但在3.3中对我没有帮助。
作为替代方案,我尝试过:
Ret['Exception'] = str(type(e)) + ": " + str(e)

这导致了一个稍微接近一点的错误信息: <class 'KeyError'>: 'job',但越来越感觉像是一种hackish。
我还想包含一个堆栈跟踪,但是我在这方面的运气更少 - 我可以得到__traceback__,但它显然不可序列化,并且对它调用str()仅会导致该对象的描述,例如<traceback object at 0x0000000004024E48>
如何获取一个好的/全面的错误消息?
1个回答

23

你可能需要使用repr

Ret['Exception'] = repr(e)

使用traceback模块来获取回溯信息:

from traceback import format_exc
Ret['Traceback'] = format_exc()

1
它们都打印相同的内容。 - jamylak
这正是我所需的 - 具体来说就是 traceback 模块。非常感谢。 - Basic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接