try:
something here
except:
print('the whatever error occurred.')
Как я могу напечатать ошибку / исключение в моем except:
блоке?
try:
something here
except:
print('the whatever error occurred.')
Как я могу напечатать ошибку / исключение в моем except:
блоке?
Ответы:
Для Python 2.6 и более поздних версий и Python 3.x:
Для Python 2.5 и более ранних версий используйте:
источник
str( KeyError('bad'))
=>'bad'
- не сообщает тип исключенияprint(repr(e))
; базоваяException.__str__
реализация возвращает только сообщение об исключении, а не тип. Или используйтеtraceback
модуль, который имеет методы для печати текущего исключения, отформатированного или полного обратного отслеживания.traceback
Модуль предоставляет методы для форматирования и печати исключений и их tracebacks, например , это будет печатать исключение , как делает обработчик по умолчанию:Вывод:
источник
error_message = traceback.format_exc()
except Exception as ex:
...sys.exc_info()
функцию, иtraceback.print_exc()
функция получает его оттуда. Вам только когда-либо понадобится явно передать исключение, когда не обрабатываете исключение или когда вы хотите показать информацию, основанную на другом исключении.В Python 2.6 или выше это немного чище:
В старых версиях это все еще вполне читабельно:
источник
Если вы хотите передать строки ошибок, вот пример из ошибок и исключений (Python 2.6)
источник
(Я собирался оставить это как комментарий к ответу @ jldupont, но у меня недостаточно репутации.)
Я видел ответы вроде @ jldupont и в других местах. FWIW, я думаю, важно отметить, что это:
выведет вывод ошибки
sys.stdout
по умолчанию. Более подходящим подходом к обработке ошибок в целом будет:(Обратите внимание, что вам нужно, чтобы
import sys
это работало.) Таким образом,STDERR
вместо этогоSTDOUT
выводится сообщение об ошибке , что позволяет правильно анализировать / перенаправлять вывод / etc. Я понимаю, что вопрос был строго о «печати ошибки», но, кажется, важно указать здесь лучшую практику, а не пропустить эту деталь, которая может привести к нестандартному коду для тех, кто в конечном итоге не научится лучше.Я не использовал этот
traceback
модуль, как в ответе Cat Plus Plus, и, возможно, это лучший способ, но я подумал, что я добавлю это.источник
Python 3:
logging
Вместо использования базовой
print()
функцииlogging
для регистрации исключения можно использовать более гибкий модуль. Вlogging
модуле предлагает много дополнительных функциональные возможности , например , сообщения протоколирования в данном файл журнал регистрации сообщений с метками времени и дополнительной информацией о том, где произошел каротаж. (Для получения дополнительной информации ознакомьтесь с официальной документацией .)Регистрация исключения может быть выполнена с помощью функции уровня модуля
logging.exception()
следующим образом:Вывод:
Ноты:
функция
logging.exception()
должна вызываться только из обработчика исключенийlogging
модуль не должен использоваться внутри обработчика регистрации , чтобы избежатьRecursionError
(спасибо @PrakharPandey)Альтернативные лог-уровни
Также возможно зарегистрировать исключение на другом уровне журнала, используя аргумент ключевого слова,
exc_info=True
например:источник
Если вы хотите этого, вы можете сделать одно исправление ошибки с помощью операторов assert. Это поможет вам написать статически исправимый код и заранее проверять ошибки.
источник
Один из них в значительной степени контролирует, какая информация из трассировки будет отображаться / регистрироваться при перехвате исключений.
Код
будет производить следующую трассировку:
Распечатать / Записать полный трекбек
Как уже упоминалось, вы можете перехватить всю трассировку, используя модуль трассировки:
Это даст следующий результат:
Вы можете достичь того же, используя ведение журнала:
Вывод:
Распечатать / записать имя ошибки / только сообщение
Возможно, вас не заинтересует вся трассировка, а только самая важная информация, такая как имя исключения и сообщение об исключении, используйте:
Вывод:
источник