Якщо ви переглянете документацію щодо вбудованих помилок , то побачите, що більшість 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
атрибут, чи ні.