在Python中获取异常值

Fri*_*ias 222 python exception

如果我有那个代码:

try:
    some_method()
except Exception, e:
Run Code Online (Sandbox Code Playgroud)

如何获得此Exception值(我的意思是字符串表示)?

谢谢

aar*_*ing 302

使用 str

try:
    some_method()
except Exception as e:
    s = str(e)
Run Code Online (Sandbox Code Playgroud)

此外,大多数异常类都有一个args属性.通常,这args[0]将是一条错误消息.

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

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

  • 这个答案是危险的,因为这样的unicode异常会失败:`raise Exception(u'jörn')`.失败尤其糟糕,因为你永远不会看到实际的异常而只是一个`UnicodeDecodeError`.如果您不知道异常的编码(大多数情况下您不知道),您应该使用`repr(e)`或者如果您确实需要,在异常处理中使用另一个try-except块,捕获UnicodeDecodeErrors并回退到`repr(e)`. (47认同)
  • 同意@JörnHees.我无法计算`str`(甚至`unicode`或`.format`)由于Unicode处理而导致错误的次数.如果您没有完全控制错误消息内容,请始终使用`repr`来避免意外的Unicode错误. (10认同)
  • 我更喜欢使用`e.message`,因为`args [0]`可能实际上不是一条消息. (8认同)
  • 如果你想获得完整的异常(例如NameError("未定义"全局名称'变量'),而不是"未定义全局名称'变量'),repr(e)也很有用" (3认同)

pyf*_*unc 164

使用repr()和使用repr和str之间的区别

使用repr:

>>> try:
...     print(x)
... except Exception as e:
...     print(repr(e))
... 
NameError("name 'x' is not defined")
Run Code Online (Sandbox Code Playgroud)

使用str:

>>> try:
...     print(x)
... except Exception as e:
...     print(str(e))
... 
name 'x' is not defined
Run Code Online (Sandbox Code Playgroud)

  • 这比任何类似`str()`的解决方案*好得多,因为它实际上包含了异常类型。使用 `str()` 我得到了 `'status'`,而使用 `repr()` 我得到了 `KeyError('status')`,我就像“aaaaah,现在我明白了错误”。 (4认同)
  • 啊,`repr` 很有用,谢谢,似乎其他任何`unicode`、`str`、编码等都可能根据输入引发异常。试图保持异常查看时不是很有用,但 repr 似乎是“异常安全” (3认同)

Blc*_*ght 25

即使我意识到这是一个老问题,我还是建议使用该traceback模块来处理异常的输出.

用于traceback.print_exc()将当前异常打印到标准错误,就像它在未被捕获时打印一样,或者traceback.format_exc()获得与字符串相同的输出.如果要限制输出,可以将各种参数传递给其中任何一个函数,或者将打印重定向到类文件对象.


ced*_*beu 22

另一种方式还没有给出:

try:
    1/0
except Exception, e:
    print e.message
Run Code Online (Sandbox Code Playgroud)

输出:

integer division or modulo by zero
Run Code Online (Sandbox Code Playgroud)

args[0] 实际上可能不是一条消息.

str(e)可能会返回带有周围引号的字符串,并且可能返回带有前导uif的unicode:

'integer division or modulo by zero'
Run Code Online (Sandbox Code Playgroud)

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

"ZeroDivisionError('integer division or modulo by zero',)"
Run Code Online (Sandbox Code Playgroud)

编辑

我的错 !!!它似乎BaseException.message 已被弃用2.6,最后,似乎仍然没有标准化的方式来显示异常消息.所以我想最好是做处理e.args,并str(e)根据您的需要(也可能是e.message,如果你正在使用的lib是依靠这一机制).

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

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


Tim*_*ski 8

以下对我有用:

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())
Run Code Online (Sandbox Code Playgroud)

如果some_method()引发异常ValueError("asdf"),则会打印您在回溯中看到的内容 - 减去回溯:ValueError: asdf

这是关于此的文档


Dan*_*ick 7

要检查错误消息并对其执行某些操作(使用 Python 3)...

try:
    some_method()
except Exception as e:
    if {value} in e.args:
        {do something}
Run Code Online (Sandbox Code Playgroud)