Wenn Sie sich die Dokumentation für die integrierten Fehler ansehen , werden Sie feststellen, dass die meisten Exception
Klassen ihr erstes Argument als message
Attribut zuweisen . Nicht alle von ihnen tun dies jedoch.
Insbesondere EnvironmentError
(mit Unterklassen IOError
und OSError
) hat ein erstes Argument von errno
, das zweite von strerror
. Es gibt kein message
... strerror
ist ungefähr analog zu dem, was normalerweise ein wäre message
.
Im Allgemeinen können Unterklassen von Exception
tun, was sie wollen. Sie können ein message
Attribut haben oder nicht . Zukünftige integrierte Exception
s haben möglicherweise kein message
Attribut. Jede Exception
Unterklasse 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 Exception
Unterklassen zu identifizieren, die Sie abfangen möchten, und dann nur diejenigen anstelle von allem mit einem except Exception
abzufangen und dann die Attribute zu verwenden, die diese bestimmte Unterklasse definiert, wie Sie möchten.
Wenn Sie print
etwas müssen , denke ich, dass das Drucken des gefangenen Exception
selbst höchstwahrscheinlich das tut, was Sie wollen, unabhängig davon, ob es ein message
Attribut 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 einemmessage
Attribut kommt oder nicht, ist getrennt.