Ответы:
Для Python 2.6 и более поздних версий и Python 3.x:
except Exception as e: print(e)
Для Python 2.5 и более ранних версий используйте:
except Exception,e: print str(e)
str( KeyError('bad'))
=> 'bad'
- не сообщает тип исключения
print(repr(e))
; базовая Exception.__str__
реализация возвращает только сообщение об исключении, а не тип. Или используйте traceback
модуль, который имеет методы для печати текущего исключения, отформатированного или полного обратного отслеживания.
traceback
Модуль предоставляет методы для форматирования и печати исключений и их tracebacks, например , это будет печатать исключение , как делает обработчик по умолчанию:
import traceback
try:
1/0
except Exception:
traceback.print_exc()
Вывод:
Traceback (most recent call last):
File "C:\scripts\divide_by_zero.py", line 4, in <module>
1/0
ZeroDivisionError: division by zero
error_message = traceback.format_exc()
except Exception as ex:
...
sys.exc_info()
функцию, и traceback.print_exc()
функция получает его оттуда. Вам только когда-либо понадобится явно передать исключение, когда не обрабатываете исключение или когда вы хотите показать информацию, основанную на другом исключении.
В Python 2.6 или выше это немного чище:
except Exception as e: print(e)
В старых версиях это все еще вполне читабельно:
except Exception, e: print e
Если вы хотите передать строки ошибок, вот пример из ошибок и исключений (Python 2.6)
>>> try:
... raise Exception('spam', 'eggs')
... except Exception as inst:
... print type(inst) # the exception instance
... print inst.args # arguments stored in .args
... print inst # __str__ allows args to printed directly
... x, y = inst # __getitem__ allows args to be unpacked directly
... print 'x =', x
... print 'y =', y
...
<type 'exceptions.Exception'>
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs
(Я собирался оставить это как комментарий к ответу @ jldupont, но у меня недостаточно репутации.)
Я видел ответы вроде @ jldupont и в других местах. FWIW, я думаю, важно отметить, что это:
except Exception as e:
print(e)
выведет вывод ошибки sys.stdout
по умолчанию. Более подходящим подходом к обработке ошибок в целом будет:
except Exception as e:
print(e, file=sys.stderr)
(Обратите внимание, что вам нужно, чтобы import sys
это работало.) Таким образом, STDERR
вместо этого STDOUT
выводится сообщение об ошибке , что позволяет правильно анализировать / перенаправлять вывод / etc. Я понимаю, что вопрос был строго о «печати ошибки», но, кажется, важно указать здесь лучшую практику, а не пропустить эту деталь, которая может привести к нестандартному коду для тех, кто в конечном итоге не научится лучше.
Я не использовал этот traceback
модуль, как в ответе Cat Plus Plus, и, возможно, это лучший способ, но я подумал, что я добавлю это.
logging
Вместо использования базовой print()
функции logging
для регистрации исключения можно использовать более гибкий модуль. В logging
модуле предлагает много дополнительных функциональные возможности , например , сообщения протоколирования в данном файл журнал регистрации сообщений с метками времени и дополнительной информацией о том, где произошел каротаж. (Для получения дополнительной информации ознакомьтесь с официальной документацией .)
Регистрация исключения может быть выполнена с помощью функции уровня модуля logging.exception()
следующим образом:
import logging
try:
1/0
except BaseException:
logging.exception("An exception was thrown!")
Вывод:
ERROR:root:An exception was thrown!
Traceback (most recent call last):
File ".../Desktop/test.py", line 4, in <module>
1/0
ZeroDivisionError: division by zero
Ноты:
функция logging.exception()
должна вызываться только из обработчика исключений
logging
модуль не должен использоваться внутри обработчика регистрации , чтобы избежать RecursionError
(спасибо @PrakharPandey)
Также возможно зарегистрировать исключение на другом уровне журнала, используя аргумент ключевого слова, exc_info=True
например:
logging.debug("An exception was thrown!", exc_info=True)
logging.info("An exception was thrown!", exc_info=True)
logging.warning("An exception was thrown!", exc_info=True)
Один из них в значительной степени контролирует, какая информация из трассировки будет отображаться / регистрироваться при перехвате исключений.
Код
with open("not_existing_file.txt", 'r') as text:
pass
будет производить следующую трассировку:
Traceback (most recent call last):
File "exception_checks.py", line 19, in <module>
with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'
Как уже упоминалось, вы можете перехватить всю трассировку, используя модуль трассировки:
import traceback
try:
with open("not_existing_file.txt", 'r') as text:
pass
except Exception as exception:
traceback.print_exc()
Это даст следующий результат:
Traceback (most recent call last):
File "exception_checks.py", line 19, in <module>
with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'
Вы можете достичь того же, используя ведение журнала:
try:
with open("not_existing_file.txt", 'r') as text:
pass
except Exception as exception:
logger.error(exception, exc_info=True)
Вывод:
__main__: 2020-05-27 12:10:47-ERROR- [Errno 2] No such file or directory: 'not_existing_file.txt'
Traceback (most recent call last):
File "exception_checks.py", line 27, in <module>
with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'
Возможно, вас не заинтересует вся трассировка, а только самая важная информация, такая как имя исключения и сообщение об исключении, используйте:
try:
with open("not_existing_file.txt", 'r') as text:
pass
except Exception as exception:
print("Exception: {}".format(type(exception).__name__))
print("Exception message: {}".format(exception))
Вывод:
Exception: FileNotFoundError
Exception message: [Errno 2] No such file or directory: 'not_existing_file.txt'