Получение значения исключения в Python - PullRequest
205 голосов
/ 30 ноября 2010

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

try:
    some_method()
except Exception, e:

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

Ответы [ 6 ]

276 голосов
/ 30 ноября 2010

использование str

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

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

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

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

157 голосов
/ 30 ноября 2010

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

Использование repr:

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

Использование str:

>>> 
>>> try:
...     print x
... except Exception, e:
...     print str(e)
... 
name 'x' is not defined
>>> 
>>> 
23 голосов
/ 16 октября 2013

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

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

23 голосов
/ 15 октября 2013

Другой способ еще не дан:

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

edit

Мой плохой !!!Похоже, что 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")'

0 голосов
/ 29 апреля 2017

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

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

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

[W] PEP 8 (E722): do not use bare except
0 голосов
/ 20 апреля 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...