在Python中获取exception值
如果我有这样的代码:
try: some_method() except Exception,e:
我怎样才能得到这个exception值(string表示我的意思)?
谢谢
使用str
try: some_method() except Exception as e: s = str(e)
另外,大多数exception类都会有一个args
属性。 通常, args[0]
将是一个错误消息。
需要注意的是,如果没有错误信息,只是使用str
将返回一个空string,而使用repr
作为pyfuncbuild议将至less显示exception的类。 我的意思是,如果你打印出来,最终用户不关心什么类,只是想要一个错误消息。
这真的取决于你正在处理的exception类,以及它是如何实例化的。 你有没有特别的想法?
使用repr()和使用repr和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 >>> >>>
还没有给出另一种方法:
try: 1/0 except Exception, e: print e.message
输出:
integer division or modulo by zero
args[0]
实际上可能不是一个消息。
str(e)
可能会返回带有周围引号的string,如果是unicode,
'integer division or modulo by zero'
repr(e)
给出了完全的例外表示,这可能不是你想要的:
"ZeroDivisionError('integer division or modulo by zero',)"
编辑
我的错 !!! 看起来, BaseException.message
已经被2.6
弃用了 ,最后,看起来似乎还没有一个标准化的方式来显示exception消息。 所以我想最好是根据你的需要来处理e.args
和str(e)
(如果你正在使用的库依赖于这个机制的话,可能还有e.message
)。
例如,使用pygraphviz
, e.message
是正确显示exception的唯一方法,使用str(e)
将用u''
包围消息。
但是对于MySQLdb
,检索消息的正确方法是e.args[1]
: e.message
是空的, str(e)
将显示'(ERR_CODE, "ERR_MSG")'
即使我意识到这是一个老问题,我想build议使用traceback
模块来处理exception的输出。
使用traceback.print_exc()
将标准错误的当前exception打印出来,就像在未被捕获的情况下打印出来一样,或者traceback.format_exc()
获得与string相同的输出。 如果要限制输出,或者将打印redirect到类似文件的对象,则可以将各种parameter passing给这些函数中的任何一个。
对于python2,最好使用e.message
来获取exception消息,这将避免可能的UnicodeDecodeError
。 但是,对于某些类似OSError
, e.message
是空的,在这种情况下,我们可以将exc_info=True
添加到我们的日志loggingfunction中,以便不错过错误。
对于python3,我认为使用str(e)
是安全的。
如果您不知道错误的types/来源,则可以尝试:
import sys try: doSomethingWrongHere() except: print('Error: {}'.format(sys.exc_info()[0]))
但请注意,你会得到pep8警告:
[W] PEP 8 (E722): do not use bare except
- MySQL:无法创build/写入文件“/tmp/#sql_3c6_0.MYI”(Errcode:2) – 它甚至意味着什么?
- IllegalStateException的用途是什么?
- 为什么不能在一个try块中出现返回值?
- 好的方法来封装Integer.parseInt()
- 如何用variables消息抛出std :: exceptions?
- java.rmi.NoSuchObjectException:表中没有这样的对象
- 有没有办法来防止从sys.exit()引发SystemExitexception被捕获?
- IntelliJ中是否有“Break on Exception”?
- 解密.NET clr20r3exception参数P1..P10