Jeśli przejrzysz dokumentację dotyczącą błędów wbudowanych , zobaczysz, że większość Exception
klas przypisuje pierwszy argument jako message
atrybut. Nie wszyscy jednak.
Warto zauważyć, że EnvironmentError
(z podklasami IOError
i OSError
) ma pierwszy argument errno
, drugi z strerror
. Nie ma message
... strerror
jest mniej więcej analogiczne do tego, co normalnie byłoby message
.
Mówiąc bardziej ogólnie, podklasy Exception
mogą robić, co chcą. Mogą mieć message
atrybut lub nie . Przyszłe wbudowane elementy Exception
mogą nie mieć message
atrybutu. Żadna Exception
podklasa zaimportowana z bibliotek innych firm lub kod użytkownika może nie mieć message
atrybutu.
Myślę, że właściwym sposobem radzenia sobie z tym jest zidentyfikowanie konkretnych Exception
podklas, które chcesz wyłapać, a następnie wyłapanie tylko tych, a nie wszystkiego za pomocą znaku except Exception
, a następnie wykorzystanie dowolnych atrybutów, które określona podklasa definiuje, jak chcesz.
Jeśli musisz print
coś, myślę, że drukowanie złapanego Exception
samego siebie najprawdopodobniej zrobi to, co chcesz, bez względu na to, czy ma message
atrybut, czy nie.
Możesz również sprawdzić atrybut wiadomości, jeśli chcesz, w ten sposób, ale tak naprawdę nie sugerowałbym tego, ponieważ wydaje się po prostu niechlujny:
try:
pass
except Exception as e:
if hasattr(e, 'message'):
print(e.message)
else:
print(e)
except Foo as bar:
jest to to samo, coexcept Foo, bar:
(z wyjątkiem tego, że pierwsza jest nowsza i będzie działać w 3.x), niezależnie od tego, czy błąd występuje zmessage
atrybutem, czy nie.