在Python中获取异常值


239

如果我有该代码:

try:
    some_method()
except Exception, e:

我如何获得此Exception值(我的意思是字符串表示)?

Answers:


323

str

try:
    some_method()
except Exception as e:
    s = str(e)

同样,大多数异常类都具有args属性。通常,args[0]将是错误消息。

应该注意的是,str如果没有错误消息,仅使用将返回一个空字符串,而使用reprpyfunc建议使用至少将显示异常的类。我的看法是,如果要打印出来,它是针对最终用户的,它并不关心类是什么,只需要一条错误消息。

它实际上取决于您要处理的异常类以及如何实例化它。您有什么特别的想法吗?


我正在打印此报告,我想str(e)很好。非常感谢
Frias

8
我宁愿使用,e.message因为args[0]实际上可能不是消息。
cedbeu

3
如果您想获取完整的异常(例如,NameError(“未定义全局名称'变量'”),),而不是“未定义全局名称'变量'”,则repr(e)也很有帮助
Ben Morris

49
这个答案很危险,因为它将无法处理unicode异常,例如:raise Exception(u'jörn')。失败尤其严重,因为您将永远看不到实际的异常,而只会看到UnicodeDecodeError。如果您不知道异常的编码(大部分时间都不知道),则应该继续工作,repr(e)或者如果确实需要,请在异常处理中使用另一个try-except块,该块捕获UnicodeDecodeErrors并退回到repr(e)
乔恩赫斯

11
同意@JörnHees。我无法计算str(或什至unicode.format)由于Unicode处理而导致错误的次数。如果您不能完全控制错误消息的内容,请始终使用repr以避免意外的Unicode错误。
肯尼·特雷泰克

186

使用repr()和使用repr和str之间的区别

使用repr

>>> try:
...     print(x)
... except Exception as e:
...     print(repr(e))
... 
NameError("name 'x' is not defined")

使用str

>>> try:
...     print(x)
... except Exception as e:
...     print(str(e))
... 
name 'x' is not defined

2
啊,repr是非常有用的感谢,似乎什么都重要unicodestr编码,...可以提高取决于输入一个例外。尝试保留异常外观时并不太有用,但是exception-safe看起来很
普遍

2
这是很多比任何好str()样的解决方案,因为它实际上包括异常的类型。与str()'status'在一起,与repr()我在一起时KeyError('status'),我就像“ aaaaah,现在我明白了错误”。
jlh

27

即使我意识到这是一个老问题,我还是建议使用traceback模块来处理异常的输出。

用于traceback.print_exc()将当前异常打印为标准错误,就像在未捕获的情况下将其打印一样,或者traceback.format_exc()将其作为字符串输出。如果要限制输出,或者可以将打印重定向到类似文件的对象,则可以将各种参数传递给这些函数中的任何一个。


23

尚未给出另一种方式:

try:
    1/0
except Exception, e:
    print e.message

输出:

integer division or modulo by zero

args[0] 可能实际上不是消息。

str(e)可能返回带引号的字符串,u如果可能,则返回带前导的字符串:

'integer division or modulo by zero'

repr(e) 给出完整的异常表示,这可能不是您想要的:

"ZeroDivisionError('integer division or modulo by zero',)"

编辑

我的错 !!!似乎BaseException.message 已从弃用2.6,最后,似乎仍然没有标准化的方式来显示异常消息。所以我想最好是做处理e.argsstr(e)根据您的需要(也可能是e.message,如果你正在使用的lib是依靠这一机制)。

例如,使用pygraphvize.message是正确显示异常的唯一方法,使用str(e)将消息包围u''

但是,使用MySQLdb,检索消息的正确方法是e.args[1]e.message为空,str(e)并将显示'(ERR_CODE, "ERR_MSG")'


0

对于python2,最好使用e.message来获取异常消息,这样可以避免可能UnicodeDecodeError。但是yes e.message对于某些异常(如)将为空OSError,在这种情况下,我们可以exc_info=True向日志记录功能中添加a ,以免出错。
对于python3,我认为使用是安全的str(e)


0

如果您不知道错误的类型/来源,可以尝试:

import sys
try:
    doSomethingWrongHere()
except:
    print('Error: {}'.format(sys.exc_info()[0]))

但是请注意,您会收到pep8警告:

[W] PEP 8 (E722): do not use bare except

0

要检查错误消息并对其进行处理(使用Python 3)...

try:
    some_method()
except Exception as e:
    if {value} in e.args:
        {do something}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.