Определение и использование настраиваемых исключений

Я разрабатываю программное обеспечение с помощью Python в течение достаточно долгого времени, почти не используя пользовательские исключения. Однако сейчас я изо всех сил стараюсь их использовать и, возможно, злоупотреблять ими. Давайте поговорим о том, почему я изменил свое мнение о них.

TL;DR: настраиваемые исключения позволяют разработчикам выбирать ошибки.

Пользовательские исключения легко создавать и использовать

В Python пользовательские исключения очень легко создавать и использовать.

Это так же просто, как объявить класс, наследуемый от Exception:

Отлично, теперь у вас есть новый тип исключения. Вы можете поднять его в своем коде, когда это необходимо.

Зачем использовать пользовательские исключения?

Ответ не очевиден. В стандартной библиотеке уже есть множество исключений, и это очень заманчиво и избавляет от многих сомнений и опасений при использовании предопределенных.

Давайте рассмотрим пример, когда исключения по умолчанию не совпадают.

Еще во времена Python 2 многие функции os вызывали исключение OSError. OSError исключения могут быть разными. Они варьируются от ошибок прав доступа, файла не существует до сбоев диска или сети, слишком большого количества открытых файлов или множества других вещей. Единственный способ выяснить, скажем, если файл просто отсутствует из-за сбоя жесткого диска, — это перехватить исключение, проверить код errno и повторно вызвать исключение:

Тот же код в Python 3:

Как видите, это и проще, и читабельнее.

Есть еще более сложные примеры или даже иногда случаи, когда вы просто не можете знать наверняка, что происходит. Поднять, скажем, AttributeError — ужасная вещь. Возьмемmy_function().something. Как можно выяснить, породила ли функция это исключение или оно было вызвано доступом к чему-либо? Что, если функция вызовет то же исключение, что и базовые библиотеки? Слишком часто основная причина различна и требует другого подхода. Как это возможно, если исключения выглядят одинаково?

Обратная совместимость

Пользовательские исключения легко ввести. В примере IsADirectoryError наследуется от OSError. Это означает, что обновление кода fopen для использования нового исключения не нарушит наш устаревший код. Поймать OSError все равно получится!

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

Источник: ledsshop.ru

Стиль жизни - Здоровье!