Ответ 1
Если вы посмотрите на документацию для встроенных ошибок, вы увидите, что большинство классов Exception
назначают свой первый аргумент как a 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)