在Python中获取异常值

Getting the exception value in Python

如果我有那个代码:

1
2
3
try:
    some_method()
except Exception, e:

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


使用str

1
2
3
4
try:
    some_method()
except Exception as e:
    s = str(e)

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

应该注意的是,如果没有错误消息,只使用str将返回空字符串,而使用repr作为pyfunc建议将至少显示异常的类。我的看法是,如果你打印出来的话,最终用户并不关心这个类是什么,只是想要一个错误信息。

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


Use repr() and The difference between using repr and str

使用repr:

1
2
3
4
5
6
7
>>> try:
...     print x
... except Exception, e:
...     print repr(e)
...
NameError("name 'x' is not defined",)
>>>

使用str:

1
2
3
4
5
6
7
8
9
>>>
>>> try:
...     print x
... except Exception, e:
...     print str(e)
...
name 'x' is not defined
>>>
>>>


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

使用traceback.print_exc()将当前异常打印到标准错误,就像它在未被捕获时打印一样,或者traceback.format_exc()以获得与字符串相同的输出。如果要限制输出,可以将各种参数传递给其中任何一个函数,或者将打印重定向到类文件对象。


另一种方式还没有给出:

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

输出:

1
integer division or modulo by zero

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

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

1
'integer division or modulo by zero'

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

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

编辑

我的错 !!!似乎BaseException.message已经从2.6弃用了,最后,似乎仍然没有标准化的方式来显示异常消息。所以我想最好的办法是根据你的需要处理e.argsstr(e)(如果你使用的lib依赖于那个机制,可能会e.message)。

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

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


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

1
2
3
4
5
import sys
try:
    doSomethingWrongHere()
except:
    print('Error: {}'.format(sys.exc_info()[0]))

但要注意,你会得到pep8警告:

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

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