如果我有那个代码:

try:

some_method()

except Exception, e:

如何获得此Exception值(字符串

代表我的意思)?

使用str

try:

some_method()

except Exception as e:

s = str(e)

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

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

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

我打印这个报告,str(e)我觉得很好。非常感谢

我更喜欢使用e.message因为args[0]可能实际上不是消息。

如果你想获得完整的异常(例如NameError("未定义"全局名称'变量'),而不是"未定义全局名称'变量'),repr(e)也很有用"

这个答案很危险,因为像这样的unicode异常会失败:raise Exception(u'jörn')。失败尤其糟糕,因为你永远不会看到实际的异常而只是UnicodeDecodeError。如果您不知道异常的编码(大多数情况下您不知道),您应该使用repr(e)或者如果您确实需要,在异常处理中使用另一个try-except块来捕获UnicodeDecodeErrors和回到repr(e)。

同意@ Jö rnHees。我无法计算str(或甚至unicode或.format)因Unicode处理而导致错误的次数。如果您无法完全控制错误消息内容,请始终使用repr以避免意外的Unicode错误。

就我而言,e.read()给出了str(e)没有的错误信息。知道为什么@aaronasterling?

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

使用repr:

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

使用str:

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

很棒的建议!不知道异常的区别。

我建议对未定义的'e'和异常'e'使用不同的字母,以避免让人混淆

啊,repr非常有用,谢谢,似乎其他任何东西unicode,str,编码,...可能会根据输入引发异常。在尝试保持异常时看起来不太有用,但看起来repr 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)可能会返回带有引号的字符串,如果是unicode,则可能返回前导u:

'integer division or modulo by zero'

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

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

编辑

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

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

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

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

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

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

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

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

对于python3,我认为使用str(e)是安全的。