在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.argsstr(e) (如果你正在使用的库依赖于这个机制的话,可能还有e.message )。

例如,使用pygraphvize.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 。 但是,对于某些类似OSErrore.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