Паттерн: Обработка ошибок и исключений
Этот кейс демонстрирует правила создания кастомных исключений, предотвращение перехвата широких ошибок и сохранение контекста исходных исключений.
Что не так в bad_pattern.py?
- Глотание ошибок (Swallowing):
python except Exception: passЭто самый опасный антипаттерн. В случае сбоя (нет файла, нет прав, битый диск) функция возвращаетNoneбез предупреждения. Ошибка всплывет позже в совершенно другом месте (например, при попытке вызвать метод у строки), и разобраться в причинах будет крайне сложно. - Широкий перехват (
except Exception): Перехват базовогоExceptionмаскирует программные ошибки (например,NameErrorилиTypeError), мешая их отладке. - Потеря оригинального трассировочного стека (Traceback):
python except Exception as e: raise Exception(f"Ошибка парсинга порта: {e}")Конструкцияraise Exceptionстирает исходное место возникновения ошибки. Разработчик увидит только строчку создания новогоException. - Базовые классы исключений:
Использование стандартных
ExceptionилиValueErrorдля специфических сбоев мешает вызывающему коду точечно обрабатывать разные типы проблем.
Что сделано правильно в good_pattern.py?
- Специализированные классы исключений:
python class ConfigLoadError(ChutilsException): passКлассы унаследованы отChutilsException(базовый класс ошибок библиотеки). Это позволяет вызывающему коду делать структурированную обработку:python try: read_system_config("config.yml") except ConfigLoadError as e: # Обработка только ошибок чтения except ChutilsException as e: # Обработка любых ошибок chutils - Использование
from e:python raise ConfigLoadError("...") from eКонструкцияfrom eсвязывает оригинальное исключение (например,FileNotFoundError) с новым. В логах отобразится полный стек вызовов обеих ошибок, что упрощает отладку. - Строгий локальный перехват:
Перехватываются только ожидаемые ошибки (например,
ValueError,FileNotFoundError,PermissionError), а не абстрактныйException. - Google Style docstrings & Type hints:
Все функции снабжены точными аннотациями типов и подробно документированы в секции
Raises:для статических анализаторов и IDE.
Ключевой совет для ИИ
[!IMPORTANT] Никогда не перехватывайте абстрактный
Exceptionбез повторного возбуждения ошибки. Для специфических сбоев всегда создавайте кастомный класс исключения, наследуемый отChutilsException(или от стандартных ошибок, если это прикладной код), и пробрасывайте его дальше с помощью синтаксисаraise CustomError(...) from e, чтобы сохранить оригинальный контекст (traceback).