Определение и обработка типа исключений в Python
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Конструкция try-except позволяет отлавливать исключения. Для определения типа исключения применяется функция type(), а для получения сообщения об ошибке используется экземпляр исключения:
try:
# Здесь размещается код, который может генерировать исключение
except Exception as e:
print(f"Тип исключения: {type(e).__name__}, сообщение: {str(e)}")
При помощи type(e).name выводится название класса исключения, а str(e) – текст сообщения об ошибке. Эти данные необходимы при отладке кода.
Перехватывайте конкретные исключения, а не общие
Перехват определенных исключений аналогичен выбору подходящего инструмента для специализированной задачи. Это повышает точность контроля и предотвращает возникновение непредвиденных ошибок:
try:
# Здесь происходит некая операция
except (ValueError, TypeError) as e:
print("Произведен перехват ValueError либо TypeError, необходима отладка!")
except Exception as e:
print(f"Обнаружено неизвестное исключение: {type(e).__name__}, {e}")
Если делается перехват общего исключения, желательно занесение его в лог или выбрасывание, чтобы сохранить информацию об ошибке:
import logging
try:
# Здесь размещается код, способный генерировать исключение
except Exception as e:
logging.error(f"Записываем в логи: {traceback.format_exc()}")
raise # Выбрасываем исключение на вышестоящий уровень обработки
Важность понимания иерархии исключений
Иерархия исключений напоминает родословное дерево. Для проверки принадлежности используйте функцию isinstance():
try:
# Строка кода, генерирующая исключение
except Exception as e:
if isinstance(e, FileNotFoundError):
print("Файл отсутствует, хотя должен был быть на месте!")
elif isinstance(e, IOError):
print("Ошибка ввода/вывода: где-то возникли неполадки!")
Визуализация
Визуализация упрощает осознание ошибки и её природы. В данном контексте под термином "визуализация" понимается просто получение информации об исключении:
try:
# Ваш код, генератор ошибок
except Exception as e:
exception_type = type(e).__name__ # Это ваше увеличительное стекло
Аналогично следам преступления, анализ исключений позволяет углубиться в детали ошибки:
🕵️♂️
"Улики повсюду!" 👀
| Исключения | Тип |
| --------------------- | ------------------- |
| ZeroDivisionError | "ZeroDivisionError" |
| KeyError | "KeyError" |
| ValueError | "ValueError" |
Таким образом, можно быстрее найти корень проблемы.
Связь пользователя и ошибки
Для повышения наглядности вывод информации об исключениях рекомендуется производить в диалоговых окнах графического интерфейса пользователя:
import tkinter as tk
from tkinter import messagebox
try:
# Код, который может быть источником проблем
except Exception as e:
messagebox.showerror("Ошибка", f"Возникла следующая ошибка: {str(e)}")
При работе с мulti-threading, убедитесь, что исключения, порождаемые в ветвях, также получают обработку:
def thread_function():
try:
# Операции в ветке
except Exception as e:
# Обработка и перебрасывание исключений в главную ветку
# Обработка переброшенных исключений в основной ветке
Подробный разбор с помощью traceback
Применение traceback позволяет отследить точное место в коде, где было выброшено исключение. traceback.format_exc()
предоставляет полный контекст событий:
import traceback
try:
# Код, в котором есть риск ошибки
except Exception as e:
print(traceback.format_exc())
Обработка исключений элегантно
В сложных ситуациях, когда текущий контекст не может корректно обработать ошибку, перебросьте исключение на вышестоящий уровень стека вызовов при помощи raise
:
try:
# Код, вызывающий подозрение на ошибку
except SomeSpecificException as e:
# Попытка устранить проблему
raise # Если устранить проблему не удаётся
При создании своих исключений учтите, что это может изменить структуру стека вызовов.
Запись исключений: ваш диагностический инструментарий
В процессе решения проблем удобно применять модуль logging
для записи всех произошедших исключений:
import logging
try:
# Здесь могут породиться ошибки
except Exception as e:
logging.exception("Спрятавшийся баг все же попал в логи!")
Полезные материалы
- Встроенные исключения в Python — Документация Python — источник знаний о встроенных исключениях в Python.
- Основы исключений в Python — Real Python — подробный расклад исключений в Python.
- Обработка исключений в Python — GeeksforGeeks — полное пособие по исключениям в мире Python.
- Как написать блок
try
/except
, который перехватывает все исключения? — Stack Overflow — различные подходы к использованию блоковtry
/except
в программировании. - Обработка исключений в Python (с примерами) — обучающие материалы и разъяснения для изучения исключений в Python.