it-roy-ru.com

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

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

try:
    some_method()
except Exception,e:

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

Спасибо

189
Frias

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

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

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

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

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

252
aaronasterling

Используйте repr () и разницу между использованием repr и str

Используя repr:

>>> try:
...     print x
... except Exception, e:
...     print repr(e)
... 
NameError("name 'x' is not defined",)
>>> 

Используя стр:

>>> 
>>> try:
...     print x
... except Exception, e:
...     print str(e)
... 
name 'x' is not defined
>>> 
>>> 
149
pyfunc

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

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

23
Blckknght

Другой путь еще не был дан:

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

23
cedbeu

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

0
apporc

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

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

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

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