Ответы:
использование 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 () и разницу между использованием 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
кажется , repr
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
. Но yes 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}