Как напечатать исключение в Python?
Заголовок: Как напечатать ошибку/исключение в блоке except:
?
Текст проблемы:
Я пытаюсь поймать исключение в блоке except:
и вывести его на экран. Однако, когда я пишу код следующим образом:
try:
...
except:
print(exception)
Я получаю ошибку, потому что переменная exception
не определена. Как я могу правильно отобразить текст ошибки или исключения внутри блока except
?
5 ответ(ов)
Для Python 2.6 и более поздних версий, а также Python 3.x вы можете использовать следующий синтаксис для обработки исключений:
except Exception as e:
print(e)
Для Python 2.5 и более ранних версий используйте:
except Exception, e:
print str(e)
Этот подход позволяет вам корректно обрабатывать исключения и выводить сообщения об ошибках в разных версиях Python.
В Python 2.6 и выше код выглядит немного чище:
except Exception as e: print(e)
В более старых версиях код также остается достаточно читаемым:
except Exception, e: print e
В любом случае, старайтесь обрабатывать исключения корректно и не забывайте про отладочную информацию!
Вы можете использовать следующий однострочник для обработки исключений, который включает информацию о типе ошибки и месте её возникновения:
try:
1/0
except Exception as e:
print(f"{type(e).__name__} на строке {e.__traceback__.tb_lineno} в файле {__file__}: {e}")
Вывод будет следующим:
ZeroDivisionError на строке 48 в файле /Users/.../script.py: division by zero
Этот код позволяет не только поймать исключение, но и вывести полезные сведения, такие как тип ошибки и номер строки, что может значительно упростить отладку вашего кода.
При обработке исключений в Python у вас есть значительная степень контроля над тем, какую информацию из трассировки следует отображать или записывать.
Полная трассировка
Как уже упоминалось другими пользователями, вы можете поймать полную трассировку с помощью модуля traceback
. Например:
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'
Также вы можете зафиксировать трассировку, используя модуль logging
:
import logging
logger = logging.getLogger()
logging.basicConfig(level=logging.ERROR)
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'
Таким образом, вы можете выбрать, какую именно информацию об исключении вы хотите отображать или записывать в лог.
Попробуйте следующий код:
try:
print("Харе Кришна!")
except Exception as er:
print(er)
Этот фрагмент кода пытается вывести строку "Харе Кришна!". Если произойдет какая-либо ошибка, она будет перехвачена, и описание ошибки будет выведено на экран.
Вручную вызов (бросание) исключения в Python
Поймать и вывести полный трейсбек исключения в Python без остановки/выхода из программы
Как проверить, существует ли переменная?
Как протестировать, что функция Python вызывает исключение?
Сохранение сообщений об исключениях в Python