python - 如何在 Python 中正确获取异常消息

标签 python exception exception-handling

从 Python 标准库的组件中获取异常消息的最佳方法是什么?

我注意到在某些情况下,您可以通过 message 字段获取它,如下所示:

try:
  pass
except Exception as ex:
  print(ex.message)

但在某些情况下(例如,在套接字错误的情况下)您必须执行以下操作:

try:
  pass
except socket.error as ex:
  print(ex)

我想知道是否有任何标准方法可以涵盖大多数这些情况?

最佳答案

如果您查看 documentation for the built-in errors ,您会看到大多数 Exception 类将它们的第一个参数分配为 message 属性。但并非所有人都这样做。

值得注意的是,EnvironmentError(具有子类 IOErrorOSError)的第一个参数是 errno,第二个参数是strerror。没有 message... strerror 大致类似于通常的 message

更一般地说,Exception 的子类可以为所欲为。它们可能有也可能没有 message 属性。 future 的内置 Exception 可能没有 message 属性。从第三方库或用户代码导入的任何 Exception 子类可能没有 message 属性。

我认为处理这个问题的正确方法是识别你想要捕获的特定 Exception 子类,然后只捕获那些而不是所有带有 except Exception 的子类,然后使用特定子类定义的任何属性。

如果你必须 print 一些东西,我认为打印捕获的 Exception 本身最有可能做你想做的事,无论它是否有 message 属性与否。

如果你愿意,你也可以检查 message 属性,像这样,但我不会真的建议它,因为它看起来很乱:

try:
    pass
except Exception as e:
    # Just print(e) is cleaner and more likely what you want,
    # but if you insist on printing message specifically whenever possible...
    if hasattr(e, 'message'):
        print(e.message)
    else:
        print(e)

关于python - 如何在 Python 中正确获取异常消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33239308/

相关文章:

python - 在 Google App Engine 上使用 python 重新翻译音频流

Python 列表扩展和变量赋值

java - 为什么Java方法在测试类中不抛出异常?

java - 如何在失去互联网连接时停止脚本执行并在重新连接互联网时再次恢复?

Java GUI Jframe 异常处理

php - Yii2 在控制台模式下捕获异常

python - Django 组合可变数量的查询集

Python表标题到字典

perl - 如果 Perl 代码出现问题,最佳做法是什么?

scala - 为什么 Akka Streams 会吞下我的异常?