Wenn Sie sich die Dokumentation für die integrierten Fehler ansehen , werden Sie feststellen, dass die meisten ExceptionKlassen ihr erstes Argument als messageAttribut zuweisen . Nicht alle von ihnen tun dies jedoch.
Insbesondere EnvironmentError(mit Unterklassen IOErrorund OSError) hat ein erstes Argument von errno, das zweite von strerror. Es gibt kein message... strerrorist ungefähr analog zu dem, was normalerweise ein wäre message.
Im Allgemeinen können Unterklassen von Exceptiontun, was sie wollen. Sie können ein messageAttribut haben oder nicht . Zukünftige integrierte Exceptions haben möglicherweise kein messageAttribut. Jede ExceptionUnterklasse importiert von Bibliotheken von Drittanbietern oder Benutzercode möglicherweise nicht über einemessage Attribut.
Ich denke, der richtige Weg, dies zu handhaben, besteht darin, die spezifischen ExceptionUnterklassen zu identifizieren, die Sie abfangen möchten, und dann nur diejenigen anstelle von allem mit einem except Exceptionabzufangen und dann die Attribute zu verwenden, die diese bestimmte Unterklasse definiert, wie Sie möchten.
Wenn Sie printetwas müssen , denke ich, dass das Drucken des gefangenen Exceptionselbst höchstwahrscheinlich das tut, was Sie wollen, unabhängig davon, ob es ein messageAttribut hat oder nicht.
Sie können auch nach dem Nachrichtenattribut suchen, wenn Sie dies möchten, aber ich würde es nicht wirklich vorschlagen, da es nur chaotisch erscheint:
try:
pass
except Exception as e:
if hasattr(e, 'message'):
print(e.message)
else:
print(e)
except Foo as bar:ist dasselbe wieexcept Foo, bar:(außer dass das erstere neuer ist und in 3.x weiterhin funktioniert), ob der Fehler mit einemmessageAttribut kommt oder nicht, ist getrennt.