Если у меня есть этот код:Получение значения исключений в Python
try:
some_method()
except Exception,e:
Как я могу получить это значение Exception (строка представление я имею в виду)?
Благодаря
Если у меня есть этот код:Получение значения исключений в Python
try:
some_method()
except Exception,e:
Как я могу получить это значение Exception (строка представление я имею в виду)?
Благодаря
использование str
try:
some_method()
except Exception as e:
s = str(e)
Кроме того, большинство классов исключений будет иметь атрибут args
. Часто, args[0]
будет сообщение об ошибке.
Следует отметить, что только с использованием str
будет возвращена пустая строка, если нет сообщения об ошибке, тогда как использование repr
, как рекомендует pyfunc, по крайней мере, отобразит класс исключения. Я считаю, что если вы распечатываете его, то для конечного пользователя все равно, что такое класс, и просто хочет получить сообщение об ошибке.
Это действительно зависит от класса исключения, с которым вы имеете дело, и того, как оно создается. У вас было что-то особенное?
Использование магнезии() и разница между использованием магнезии и ул
Использование магнезии:
>>> 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
>>>
>>>
Другой способ не был данный момент времени:
try:
1/0
except Exception, e:
print e.message
Выход:
integer division or modulo by zero
args[0]
может фактически не быть сообщением.
str(e)
может вернуть строку с окружающими кавычками и, возможно, с ведущим u
если юникода:
'integer division or modulo by zero'
repr(e)
дает полное представление об исключении, которое не является, вероятно, что вы хотите:
"ZeroDivisionError('integer division or modulo by zero',)"
редактировать
My bad !!! Кажется, что BaseException.message
has been deprecated from 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")'
Хотя я понимаю, что это старый вопрос, я хотел бы предложить, используя traceback
module для обработки выходных данных исключений.
Используйте traceback.print_exc()
, чтобы напечатать текущее исключение до стандартной ошибки, точно так же, как оно будет напечатано, если оно останется неотобравшимся, или traceback.format_exc()
, чтобы получить тот же результат, что и строка. Вы можете передавать различные аргументы любой из этих функций, если хотите ограничить вывод, или перенаправить печать на файл-подобный объект.
Для 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
Я печати это, чтобы сделать отчет, str (e) в порядке, я думаю. Большое спасибо – 2010-11-29 21:40:31
Я бы предпочел использовать `e.message`, потому что` args [0] `не может быть фактически сообщением. – cedbeu 2013-10-15 10:17:50