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