如果我有这个代码:
try: some_method() except Exception, e:
我如何得到这个异常值(字符串 我是说代表)?< / p >
使用str
str
try: some_method() except Exception as e: s = str(e)
而且,大多数异常类都有args属性。通常,args[0]将是一条错误消息。
args
args[0]
应该注意的是,如果没有错误消息,仅使用str将返回一个空字符串,而按照pyfunc的建议使用repr将至少显示异常的类。我的看法是,如果您要打印它,那么它是为终端用户准备的,他们并不关心类是什么,只是想要一个错误消息。
repr
这实际上取决于您正在处理的异常类以及如何实例化它。你有什么特别的想法吗?
使用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
另一种方法还没有给出:
try: 1/0 except Exception, e: print e.message
输出:
integer division or modulo by zero
args[0]实际上可能不是一个消息。
如果unicode: str(e)可能返回带引号的字符串,并且可能带有前导u:
str(e)
u
'integer division or modulo by zero'
repr(e)给出了完整的异常表示,这可能不是你想要的:
repr(e)
"ZeroDivisionError('integer division or modulo by zero',)"
编辑
我的错!!似乎BaseException.message 已从2.6,最后,显然仍然没有一个标准化的方法来显示异常消息。所以我想最好是根据你的需要处理e.args和str(e)(如果你使用的库依赖于该机制,可能还有e.message)。
BaseException.message
2.6
e.args
e.message
例如,对于pygraphviz, e.message是正确显示异常的唯一方法,使用str(e)将用u''包围消息。
pygraphviz
u''
但是对于MySQLdb,检索消息的正确方法是e.args[1]: e.message为空,并且str(e)将显示'(ERR_CODE, "ERR_MSG")'
MySQLdb
e.args[1]
'(ERR_CODE, "ERR_MSG")'
尽管我意识到这是一个老问题,但我还是建议使用traceback模块来处理异常的输出。
traceback
使用traceback.print_exc()将当前异常打印为标准错误,就像它在未捕获时被打印一样,或者使用traceback.format_exc()获得与字符串相同的输出。如果希望限制输出,或者将打印重定向到类文件对象,可以将各种参数传递给这两个函数中的任何一个。
traceback.print_exc()
traceback.format_exc()
UnicodeDecodeError
OSError
exc_info=True
检查错误信息并对其进行处理(使用Python 3)…
try: some_method() except Exception as e: if {value} in e.args: {do something}
下面的方法对我很有效:
import traceback try: some_method() except Exception as e: # Python 3.9 or older print("".join(traceback.format_exception_only(type(e), e)).strip()) # Python 3.10+ print("".join(traceback.format_exception_only(e)).strip())
如果some_method()引发异常ValueError("asdf"),这将打印你在回溯中看到的内容——减去回溯:ValueError: asdf。
some_method()
ValueError("asdf")
ValueError: asdf
这里是关于这个的文档。