Определение и обработка типа исключений в Python

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Конструкция try-except позволяет отлавливать исключения. Для определения типа исключения применяется функция type(), а для получения сообщения об ошибке используется экземпляр исключения:

Python
Скопировать код
try:
    # Здесь размещается код, который может генерировать исключение
except Exception as e:
    print(f"Тип исключения: {type(e).__name__}, сообщение: {str(e)}")

При помощи type(e).name выводится название класса исключения, а str(e) – текст сообщения об ошибке. Эти данные необходимы при отладке кода.

Кинга Идем в IT: пошаговый план для смены профессии

Перехватывайте конкретные исключения, а не общие

Перехват определенных исключений аналогичен выбору подходящего инструмента для специализированной задачи. Это повышает точность контроля и предотвращает возникновение непредвиденных ошибок:

Python
Скопировать код
try:
    # Здесь происходит некая операция
except (ValueError, TypeError) as e:
    print("Произведен перехват ValueError либо TypeError, необходима отладка!")
except Exception as e:
    print(f"Обнаружено неизвестное исключение: {type(e).__name__}, {e}")

Если делается перехват общего исключения, желательно занесение его в лог или выбрасывание, чтобы сохранить информацию об ошибке:

Python
Скопировать код
import logging

try:
    # Здесь размещается код, способный генерировать исключение
except Exception as e:
    logging.error(f"Записываем в логи: {traceback.format_exc()}")
    raise  # Выбрасываем исключение на вышестоящий уровень обработки

Важность понимания иерархии исключений

Иерархия исключений напоминает родословное дерево. Для проверки принадлежности используйте функцию isinstance():

Python
Скопировать код
try:
    # Строка кода, генерирующая исключение
except Exception as e:
    if isinstance(e, FileNotFoundError):
        print("Файл отсутствует, хотя должен был быть на месте!")
    elif isinstance(e, IOError):
        print("Ошибка ввода/вывода: где-то возникли неполадки!")

Визуализация

Визуализация упрощает осознание ошибки и её природы. В данном контексте под термином "визуализация" понимается просто получение информации об исключении:

Python
Скопировать код
try:
    # Ваш код, генератор ошибок
except Exception as e:
    exception_type = type(e).__name__  # Это ваше увеличительное стекло

Аналогично следам преступления, анализ исключений позволяет углубиться в детали ошибки:

Markdown
Скопировать код
🕵️‍♂️
"Улики повсюду!" 👀
| Исключения            | Тип                 |
| --------------------- | ------------------- |
| ZeroDivisionError     | "ZeroDivisionError" |
| KeyError              | "KeyError"          |
| ValueError            | "ValueError"        |

Таким образом, можно быстрее найти корень проблемы.

Связь пользователя и ошибки

Для повышения наглядности вывод информации об исключениях рекомендуется производить в диалоговых окнах графического интерфейса пользователя:

Python
Скопировать код
import tkinter as tk
from tkinter import messagebox

try:
    # Код, который может быть источником проблем
except Exception as e:
    messagebox.showerror("Ошибка", f"Возникла следующая ошибка: {str(e)}")

При работе с мulti-threading, убедитесь, что исключения, порождаемые в ветвях, также получают обработку:

Python
Скопировать код
def thread_function():
    try:
        # Операции в ветке
    except Exception as e:
        # Обработка и перебрасывание исключений в главную ветку

# Обработка переброшенных исключений в основной ветке

Подробный разбор с помощью traceback

Применение traceback позволяет отследить точное место в коде, где было выброшено исключение. traceback.format_exc() предоставляет полный контекст событий:

Python
Скопировать код
import traceback

try:
    # Код, в котором есть риск ошибки
except Exception as e:
    print(traceback.format_exc())

Обработка исключений элегантно

В сложных ситуациях, когда текущий контекст не может корректно обработать ошибку, перебросьте исключение на вышестоящий уровень стека вызовов при помощи raise:

Python
Скопировать код
try:
    # Код, вызывающий подозрение на ошибку
except SomeSpecificException as e:
    # Попытка устранить проблему
    raise  # Если устранить проблему не удаётся

При создании своих исключений учтите, что это может изменить структуру стека вызовов.

Запись исключений: ваш диагностический инструментарий

В процессе решения проблем удобно применять модуль logging для записи всех произошедших исключений:

Python
Скопировать код
import logging

try:
    # Здесь могут породиться ошибки
except Exception as e:
    logging.exception("Спрятавшийся баг все же попал в логи!")

Полезные материалы

  1. Встроенные исключения в Python — Документация Python — источник знаний о встроенных исключениях в Python.
  2. Основы исключений в Python — Real Python — подробный расклад исключений в Python.
  3. Обработка исключений в Python — GeeksforGeeks — полное пособие по исключениям в мире Python.
  4. Как написать блок try/except, который перехватывает все исключения? — Stack Overflow — различные подходы к использованию блоков try/except в программировании.
  5. Обработка исключений в Python (с примерами) — обучающие материалы и разъяснения для изучения исключений в Python.