Если вы посмотрите документацию по встроенным ошибкам , вы увидите, что большинство 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:
if hasattr(e, 'message'):
print(e.message)
else:
print(e)
except Foo as bar:
то же самоеexcept Foo, bar:
(за исключением того, что первое новее и будет продолжать работать в 3.x), независимо от того, идет ли ошибка сmessage
атрибутом или нет, является отдельным.