Если у меня есть этот код:
try:
some_method()
except Exception, e:
Как я могу получить это значение исключения (я имею в виду строковое представление)?
использование 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)
либо, если вам действительно нужно, использовать другой блок try-exc в вашей обработке исключений, который перехватывает UnicodeDecodeErrors и возвращается кrepr(e)
,str
(или дажеunicode
или.format
) вызывал ошибки из-за обработки Unicode. Если у вас нет полного контроля над содержимым сообщения об ошибке, ВСЕГДА используйте,repr
чтобы избежать непредвиденных ошибок Unicode.Использование
repr
:Использование
str
:источник
repr
полезно , спасибо, это , кажется , что -то ещеunicode
,str
кодирующим, ... может вызвать исключение в зависимости от входного сигнала. Не совсем полезно при попытке сохранить исключение для просмотра, но,exception-safe
кажется , reprstr()
подобные решения, потому что оно фактически включает тип исключения. Когдаstr()
я получил'status'
время,repr()
я получил,KeyError('status')
и я был как «аааааа, теперь я понимаю ошибку».Хотя я понимаю, что это старый вопрос, я хотел бы предложить использовать
traceback
модуль для обработки вывода исключений.Используется
traceback.print_exc()
для печати текущего исключения со стандартной ошибкой, точно так же, как оно будет напечатано, если оно останется необработанным, илиtraceback.format_exc()
для получения того же вывода, что и строка. Вы можете передавать различные аргументы любой из этих функций, если хотите ограничить вывод или перенаправить печать в файлоподобный объект.источник
Другой путь еще не был дан:
Вывод:
args[0]
может на самом деле не быть сообщением.str(e)
может вернуть строку с окружающими кавычками и, возможно, с ведущими,u
если Unicode:repr(e)
дает полное представление исключения, которое, вероятно, не то, что вы хотите:редактировать
Виноват !!! Кажется, что
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
. Но yese.message
будет пустым для каких-то исключений, напримерOSError
, в этом случае мы можем добавитьexc_info=True
к нашей функции регистрации, чтобы не пропустить ошибку.Я думаю, что для python3 это безопасно
str(e)
.источник
Если вы не знаете тип / происхождение ошибки, вы можете попробовать:
Но имейте в виду, вы получите предупреждение pep8:
источник
Чтобы просмотреть сообщение об ошибке и что-то с ним сделать (с Python 3) ...
источник