如果查看内置错误的文档,则会看到大多数Exception
类将其第一个参数分配为message
属性。并非所有人都这样做。
值得注意的是,EnvironmentError
(与子类IOError
和OSError
)具有的第一自变量errno
,第二的strerror
。没有message
…strerror
大致类似于通常的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)