Відповіді:
використання str
try:
some_method()
except Exception as e:
s = str(e)
Також більшість класів виключень матимуть argsатрибут. Часто args[0]буде повідомлення про помилку.
Слід зазначити, що просто використання strповерне порожню рядок, якщо немає повідомлення про помилку, тоді як використання, reprяк рекомендує pyfunc, принаймні відображатиме клас виключення. Я вважаю, що якщо ви роздруковуєте його, це для кінцевого користувача, який не байдуже, що це за клас, і просто хоче повідомлення про помилку.
Це дійсно залежить від винятку класу, з яким ви маєте справу, і від того, як він створений. Ви щось мали на увазі?
e.messageтому args[0]що насправді це не може бути повідомленням.
raise Exception(u'jörn'). Невдача особливо погана, тому що ви ніколи не побачите фактичного винятку, а лише а UnicodeDecodeError. Якщо ви не знаєте кодування винятку (і більшу частину часу цього не робите), вам слід працювати repr(e)або якщо вам дійсно потрібно, скористайтеся іншим блоком для випробувань, крім вашого обліку виключень, який вловлює UnicodeDecodeErrors і повертається до repr(e).
str(або навіть unicodeабо .format) викликали помилки через обробку Unicode. Якщо ви не маєте повного контролю над вмістом повідомлення про помилку, ЗАВЖДИ використовуйте, reprщоб уникнути несподіваних помилок Unicode.
Використовуйте repr () та Різниця між repr та str
Використання repr:
>>> try:
... print(x)
... except Exception as e:
... print(repr(e))
...
NameError("name 'x' is not defined")
Використання str:
>>> try:
... print(x)
... except Exception as e:
... print(str(e))
...
name 'x' is not defined
reprкорисно , спасибі, це , здається , що -то ще unicode, strщо кодує, ... може викликати виключення в залежності від вхідного сигналу. Не зовсім корисно при спробі зберегти виняток на вигляд, але передрук exception-safeздається
str()подібні рішення, оскільки воно фактично включає тип винятку. Коли str()я в 'status'той час, як repr()я отримав, KeyError('status')і я був як "аааааа, тепер я розумію помилку".
Хоча я усвідомлюю, що це давнє питання, я хотів би запропонувати використовувати tracebackмодуль для обробки результатів винятків.
Використовуйте traceback.print_exc()для друку поточного винятку зі стандартною помилкою, подібно до того, як вона буде надрукована, якби вона залишилася не збереженою, або traceback.format_exc()щоб отримати той же вихід, що і рядок. Ви можете передати різні аргументи до будь-якої з цих функцій, якщо ви хочете обмежити висновок або перенаправити друк на файл-подібний об’єкт.
Ще не вказано іншого способу:
try:
1/0
except Exception, e:
print e.message
Вихід:
integer division or modulo by zero
args[0] може насправді не бути повідомленням.
str(e)може повернути рядок з навколишніми лапками і, можливо, з провідним, uякщо unicode:
'integer division or modulo by zero'
repr(e) дає повне уявлення про виключення, яке, мабуть, не те, що ви хочете:
"ZeroDivisionError('integer division or modulo by zero',)"
редагувати
Моє ліжко !!! Здається, що BaseException.message це застаріло2.6 , нарешті, напевно здається, що досі не існує стандартизованого способу відображення повідомлень про виключення. Тож я гадаю, що найкраще - це займатися e.argsі str(e)залежно від ваших потреб (і, можливо, e.messageякщо використовувана вами покладається на цей механізм).
Наприклад, з pygraphviz, e.messageєдиний спосіб відобразити виняток, використовуючи str(e)оточує повідомлення u''.
Але з MySQLdbправильним способом отримання повідомлення є e.args[1]: e.messageпорожнє і str(e)відображатиметься'(ERR_CODE, "ERR_MSG")'
Для python2, краще використовувати e.messageдля отримання повідомлення про виняток, це уникне можливого UnicodeDecodeError. Але так e.messageбуде порожнім для деяких винятків, наприклад OSError, у цьому випадку ми можемо додати exc_info=Trueдо нашої функції реєстрації даних, щоб не пропустити помилку.
Для python3 я думаю, що це безпечно у використанні str(e).
Щоб перевірити повідомлення про помилку і зробити щось із ним (з Python 3) ...
try:
some_method()
except Exception as e:
if {value} in e.args:
{do something}