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建议将至少显示异常的类。我的看法是,如果你打印出来的话,最终用户并不关心这个类是什么,只是想要一个错误信息。
它实际上取决于您正在处理的异常类以及它是如何实例化的。你有什么特别的想法吗?
-
我打印这个报告,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:
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
>>>
>>> |
-
很棒的建议!不知道异常的区别。
-
我建议对未定义的'e'和异常'e'使用不同的字母,以避免让人混淆
-
啊,repr非常有用,谢谢,似乎其他任何东西unicode,str,编码,...可能会根据输入引发异常。在尝试保持异常时看起来不太有用,但看起来repr exception-safe
-
这比任何类似str()的解决方案要好得多,因为它实际上包含了异常类型。随着str()我得到'status'而repr()我得到KeyError('status')我就像"aaaaah,现在我理解错误"。
即使我意识到这是一个老问题,我还是建议使用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.args和str(e)(如果你使用的lib依赖于那个机制,可能会e.message)。
例如,使用pygraphviz,e.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)是安全的。