问题:在Python中获取异常值
如果我有该代码:
try:
some_method()
except Exception, e:
我如何获得此Exception值(我的意思是字符串表示)?
回答 0
用 str
try:
some_method()
except Exception as e:
s = str(e)
同样,大多数异常类都具有args
属性。通常,args[0]
将是错误消息。
应该注意的是,str
如果没有错误消息,仅使用将返回一个空字符串,而使用repr
pyfunc建议使用至少将显示异常的类。我的看法是,如果要打印出来,它是针对最终用户的,它并不关心类是什么,只需要一条错误消息。
它实际上取决于您要处理的异常类以及如何实例化它。您有什么特别的想法吗?
回答 1
使用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
即使我意识到这是一个老问题,我还是建议使用traceback
模块来处理异常的输出。
用于traceback.print_exc()
将当前异常打印为标准错误,就像在未捕获的情况下将其打印一样,或者traceback.format_exc()
将其作为字符串输出。如果要限制输出,或者可以将打印重定向到类似文件的对象,则可以将各种参数传递给这些函数中的任何一个。
回答 3
尚未给出另一种方式:
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.args
和str(e)
根据您的需要(也可能是e.message
,如果你正在使用的lib是依靠这一机制)。
例如,使用pygraphviz
,e.message
是正确显示异常的唯一方法,使用str(e)
将消息包围u''
。
但是,使用MySQLdb
,检索消息的正确方法是e.args[1]
:e.message
为空,str(e)
并将显示'(ERR_CODE, "ERR_MSG")'
回答 4
对于python2,最好使用e.message
来获取异常消息,这样可以避免可能UnicodeDecodeError
。但是yes e.message
对于某些异常(如)将为空OSError
,在这种情况下,我们可以exc_info=True
向日志记录功能中添加a ,以免出错。
对于python3,我认为使用是安全的str(e)
。
回答 5
如果您不知道错误的类型/来源,可以尝试:
import sys
try:
doSomethingWrongHere()
except:
print('Error: {}'.format(sys.exc_info()[0]))
但是请注意,您会收到pep8警告:
[W] PEP 8 (E722): do not use bare except
回答 6
要检查错误消息并对其进行处理(使用Python 3)…
try:
some_method()
except Exception as e:
if {value} in e.args:
{do something}