Получение значения исключения в Python

Если у меня есть этот код:

try:
    some_method()
except Exception, e:

Как я могу получить это значение исключения (я имею в виду строковое представление)?

Ответ 1

использовать str

try:
    some_method()
except Exception as e:
    s = str(e)

Кроме того, большинство классов исключений будут иметь атрибут args. Часто args[0] будет сообщением об ошибке.

Следует отметить, что просто использование str вернет пустую строку, если нет сообщения об ошибке, тогда как использование repr, как рекомендует pyfunc, по крайней мере покажет класс исключения. Мое мнение таково, что если вы распечатываете его, это для конечного пользователя, которому не важно, что такое класс, и просто хочет получить сообщение об ошибке.

Это действительно зависит от класса исключения, с которым вы имеете дело, и того, как он создается. У вас было что-то особенное в виду?

Ответ 2

  Используйте 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

Ответ 3

Даже если я понимаю, что это старый вопрос, я хотел бы предложить использовать traceback модуль для обработки выходных данных исключений.

Используйте traceback.print_exc(), чтобы напечатать текущее исключение до стандартной ошибки, точно так же, как оно будет напечатано, если оно останется неотображенным, или traceback.format_exc(), чтобы получить тот же результат, что и строка. Вы можете передать различные аргументы любой из этих функций, если хотите ограничить вывод, или перенаправить печать на файл-подобный объект.

Ответ 4

Еще один способ еще не предоставлен:

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")'

Ответ 5

Для python2 лучше использовать e.message для получения сообщения об исключении, это позволит избежать UnicodeDecodeError. Но да e.message будет пустым для каких-то исключений типа OSError, и в этом случае мы можем добавить exc_info=True к нашей функции регистрации, чтобы не пропустить ошибку.
Для python3 я считаю безопасным использовать str(e).

Ответ 6

Если вы не знаете тип/происхождение ошибки, вы можете попробовать:

import sys
try:
    doSomethingWrongHere()
except:
    print('Error: {}'.format(sys.exc_info()[0]))

Но имейте в виду, вы получите предупреждение pep8:

[W] PEP 8 (E722): do not use bare except