Перейти к содержанию

Паттерн: Обработка ошибок и исключений

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


Что не так в bad_pattern.py?

  1. Глотание ошибок (Swallowing): python except Exception: pass Это самый опасный антипаттерн. В случае сбоя (нет файла, нет прав, битый диск) функция возвращает None без предупреждения. Ошибка всплывет позже в совершенно другом месте (например, при попытке вызвать метод у строки), и разобраться в причинах будет крайне сложно.
  2. Широкий перехват (except Exception): Перехват базового Exception маскирует программные ошибки (например, NameError или TypeError), мешая их отладке.
  3. Потеря оригинального трассировочного стека (Traceback): python except Exception as e: raise Exception(f"Ошибка парсинга порта: {e}") Конструкция raise Exception стирает исходное место возникновения ошибки. Разработчик увидит только строчку создания нового Exception.
  4. Базовые классы исключений: Использование стандартных Exception или ValueError для специфических сбоев мешает вызывающему коду точечно обрабатывать разные типы проблем.

Что сделано правильно в good_pattern.py?

  1. Специализированные классы исключений: python class ConfigLoadError(ChutilsException): pass Классы унаследованы от ChutilsException (базовый класс ошибок библиотеки). Это позволяет вызывающему коду делать структурированную обработку: python try: read_system_config("config.yml") except ConfigLoadError as e: # Обработка только ошибок чтения except ChutilsException as e: # Обработка любых ошибок chutils
  2. Использование from e: python raise ConfigLoadError("...") from e Конструкция from e связывает оригинальное исключение (например, FileNotFoundError) с новым. В логах отобразится полный стек вызовов обеих ошибок, что упрощает отладку.
  3. Строгий локальный перехват: Перехватываются только ожидаемые ошибки (например, ValueError, FileNotFoundError, PermissionError), а не абстрактный Exception.
  4. Google Style docstrings & Type hints: Все функции снабжены точными аннотациями типов и подробно документированы в секции Raises: для статических анализаторов и IDE.

Ключевой совет для ИИ

[!IMPORTANT] Никогда не перехватывайте абстрактный Exception без повторного возбуждения ошибки. Для специфических сбоев всегда создавайте кастомный класс исключения, наследуемый от ChutilsException (или от стандартных ошибок, если это прикладной код), и пробрасывайте его дальше с помощью синтаксиса raise CustomError(...) from e, чтобы сохранить оригинальный контекст (traceback).