Answers:
用 str
try:
some_method()
except Exception as e:
s = str(e)
同样,大多数异常类都具有args
属性。通常,args[0]
将是错误消息。
应该注意的是,str
如果没有错误消息,仅使用将返回一个空字符串,而使用repr
pyfunc建议使用至少将显示异常的类。我的看法是,如果要打印出来,它是针对最终用户的,它并不关心类是什么,只需要一条错误消息。
它实际上取决于您要处理的异常类以及如何实例化它。您有什么特别的想法吗?
e.message
因为args[0]
实际上可能不是消息。
raise Exception(u'jörn')
。失败尤其严重,因为您将永远看不到实际的异常,而只会看到UnicodeDecodeError
。如果您不知道异常的编码(大部分时间都不知道),则应该继续工作,repr(e)
或者如果确实需要,请在异常处理中使用另一个try-except块,该块捕获UnicodeDecodeErrors并退回到repr(e)
。
str
(或什至unicode
或.format
)由于Unicode处理而导致错误的次数。如果您不能完全控制错误消息的内容,请始终使用repr
以避免意外的Unicode错误。
使用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
repr
是非常有用的感谢,似乎什么都重要unicode
,str
编码,...可以提高取决于输入一个例外。尝试保留异常外观时并不太有用,但是exception-safe
看起来很
str()
样的解决方案,因为它实际上包括异常的类型。与str()
我'status'
在一起,与repr()
我在一起时KeyError('status')
,我就像“ aaaaah,现在我明白了错误”。
即使我意识到这是一个老问题,我还是建议使用traceback
模块来处理异常的输出。
用于traceback.print_exc()
将当前异常打印为标准错误,就像在未捕获的情况下将其打印一样,或者traceback.format_exc()
将其作为字符串输出。如果要限制输出,或者可以将打印重定向到类似文件的对象,则可以将各种参数传递给这些函数中的任何一个。
尚未给出另一种方式:
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")'