小编典典

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

python

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

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

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

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

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

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


阅读 191

收藏
2020-12-20

共1个答案

小编典典

如果查看内置错误文档,则会看到大多数Exception类将其第一个参数分配为message属性。并非所有人都这样做。

值得注意的是,EnvironmentError(与子类IOErrorOSError)具有的第一自变量errno,第二的strerror。没有messagestrerror大致类似于通常的message

更一般而言,的子类Exception可以执行他们想要的任何操作。它们可能具有也可能没有message属性。将来的内置Exception可能没有message属性。Exception从第三方库或用户代码导入的任何子类都可能没有message属性。

我认为处理此问题的正确方法是,识别Exception要捕获的特定子类,然后仅捕获那些子类,而不是所有带有的except Exception子类,然后利用特定子类定义的所需属性。

如果您必须执行print某些操作,则我认为打印捕获到的Exception自身最有可能执行您想要的操作,无论它是否具有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)
2020-12-20