Обработка исключений в python
Общая информация
В некоторых ЯП ошибки отображаются с помощью специальных возвращаемых значений. В Python используется исключение: код, который выполняется, когда происходит связанная с ним ошибка. Лучше добавлять обработчик ошибок везде, где потенциально ошибки могут появится.
Иерархия исключений
Полный список исключений можно найти по ссылке: Иерархия исключений в python.
Основные конструкции для обработки исключений
Блок try
Код в блоке try
python попытается выполнить, а если не получится - выполнится блок except
.
Блок except
Не используйте bare except (голый, без указания конкретных исключений). Примеры правильного применения:
Применение as
:
Multiple exceptions:
Блок else
Код в else
выполнится, если не был вызван блок except
, то есть не отловились исключения, и не было ошибок:
Блок finally
Код в finally
выполнится в любом случае. Например:
Таким образом, файл закроется в любом случае. Вариант без finally
не гарантирует закрытие файла, так как программа может завершиться из-за неопределенных в except
исключений.
Использование raise
Вместо самодельного прерывания, используйте raise
, который предназначен для этой задачи:
Проброс исключения
Пробросом исключения называют передачу информации об ошибке дальше по коду, не обрабатывая её в текущем месте. Делается с помощью
raise
.
Пример функции divide()
, которая пробрасывает свое исключение, чтобы передать вызывающему коду информацию об ошибке:
Output:
Не надо делить на 5 😡
Еще один пример проброса исключения:
Output:
Файл неcуществующий_файл.txt не найден.
Пример проброса исключения вверх по стеку:
Output:
> Моя ошибка
> Traceback (most recent call last):
> File "test.py", line 5, in <module>
> raise Exception('min must be less than 10')
> Exception: min must be less than 10
Обработка нескольких исключений
Если предполагается, что могут возникнуть несколько типов исключений, лучшим решением будет предоставить отдельный обработчик для каждого из них:
Output:
Position [q to quit]? 1
2
Position [q to quit]? 3
Bad index: 3
Position [q to quit]? two
Something else broke: invalid literal for int() with base 10: 'two'
Position [q to quit]? q
Создание своих исключений
Для создания своих исключений нужно определить новый тип объекта с помощью класса. Пример:
Для вывода информации об исключении:
Соус: Книга “Простой Python” ⇒ Глава 9. “Функции” ⇒ “Исключения”