Если у меня есть этот код:
try:
some_method()
except Exception, e:
Как я могу получить это значение исключения (я имею в виду строковое представление)?
Если у меня есть этот код:
try:
some_method()
except Exception, e:
Как я могу получить это значение исключения (я имею в виду строковое представление)?
использовать str
try:
some_method()
except Exception as e:
s = str(e)
Кроме того, большинство классов исключений будут иметь атрибут args
. Часто args[0]
будет сообщением об ошибке.
Следует отметить, что просто использование str
вернет пустую строку, если нет сообщения об ошибке, тогда как использование repr
, как рекомендует pyfunc, по крайней мере покажет класс исключения. Мое мнение таково, что если вы распечатываете его, это для конечного пользователя, которому не важно, что такое класс, и просто хочет получить сообщение об ошибке.
Это действительно зависит от класса исключения, с которым вы имеете дело, и того, как он создается. У вас было что-то особенное в виду?
Используйте 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
Даже если я понимаю, что это старый вопрос, я хотел бы предложить использовать 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)
.
Если вы не знаете тип/происхождение ошибки, вы можете попробовать:
import sys
try:
doSomethingWrongHere()
except:
print('Error: {}'.format(sys.exc_info()[0]))
Но имейте в виду, вы получите предупреждение pep8:
[W] PEP 8 (E722): do not use bare except