2010-11-29 2 views

ответ

186

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

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

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

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

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

+0

Я печати это, чтобы сделать отчет, str (e) в порядке, я думаю. Большое спасибо – 2010-11-29 21:40:31

+5

Я бы предпочел использовать `e.message`, потому что` args [0] `не может быть фактически сообщением. – cedbeu 2013-10-15 10:17:50

119

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

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

>>> 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 
>>> 
>>> 
18

Другой способ не был данный момент времени:

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

17

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

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

0

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

0

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

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

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

[W] PEP 8 (E722): do not use bare except 
Смежные вопросы