Мастерство обработки исключений в Python: эффективное использование try, except, finally и raise
Что такое обработка исключений в Python?
Исключение — это ошибка, возникающая во время выполнения программы. Однако, пока программа работает, Python генерирует исключение, которое должно быть обработано, чтобы предотвратить аварийное завершение. В языке Python исключения возникают автоматически при ошибках, или их можно инициировать и перехватывать вашим кодом.
Исключение указывает на то, что, хотя событие может произойти, этот тип события случается редко. Когда метод не может обработать исключение, оно передаётся в вызывающую функцию. В конечном счёте, если исключение выбрасывается из главной функции, программа завершается аварийно.
В этом уроке по обработке исключений в Python вы узнаете:
- Что такое исключение в Python?
- Распространённые примеры исключений
- Зачем использовать исключения?
- Правила исключений
- Механизм обработки исключений в Python
- Оператор try в Python
- Оператор catch в Python
- Оператор raise в Python
- Важные ошибки Python
- Другие важные исключения Python
- Ошибка против исключений
Распространённые примеры исключений:
- Деление на ноль
- Доступ к несуществующему файлу
- Сложение двух несовместимых типов
- Попытка доступа к несуществующему индексу последовательности
- Удаление таблицы от отключённого сервера базы данных
- Снятие со счёта в банкомате суммы, превышающей доступный баланс
Зачем использовать исключения?
Вот причины использования исключений в Python:
- Обработка исключений позволяет отделить код обработки ошибок от нормального кода.
- Исключение — объект Python, представляющий ошибку.
- Как комментарии в коде, исключения помогают напомнить, чего ожидает программа.
- Оно проясняет код и повышает читаемость.
- Позволяет стимулировать последствия, так как обработка ошибок происходит в одном месте и единообразно.
- Исключение — удобный метод для обработки сообщений об ошибках.
- В Python можно вызвать исключение в программе с помощью метода raise.
- Вызов исключения помогает прервать текущее выполнение кода и вернуть исключение обратно до его обработки.
- Обработка исключений для компонентов, которые не могут обработать их напрямую.
Правила исключений
Вот основные правила обработки исключений в Python:
- Исключения должны быть объектами классов
- Для классовых исключений можно использовать оператор try с блоком except, указывающим конкретный класс.
- Даже если инструкция или выражение синтаксически корректны, они могут выдать ошибку при попытке выполнения.
- Ошибки, найденные во время выполнения, называются исключениями, и они не безусловно фатальны.
Механизм обработки исключений в Python
Обработка исключений управляется следующими 5 ключевыми словами:
- try
- except (catch)
- finally
- raise (throw)
Оператор try в Python
Оператор try включает ключевое слово try, за которым следует двоеточие (:) и блок кода, в котором могут возникнуть исключения. У него один или несколько блоков except.
Во время выполнения try, если исключений не возникло, интерпретатор игнорирует обработчики исключений для этого конкретного try.
Если же исключение возникает в блоке try, блок try завершается, и управление передаётся соответствующему блоку except, следующему за try.
Синтаксис:
try:
statement(s)
Оператор except (catch)
Блоки except принимают один аргумент за раз — тип исключения, который они могут перехватить. Эти аргументы могут варьироваться от конкретного типа исключения до общего категории исключений.
Правила для блока except:
- Блок except определяется ключевым словом except
- Параметр исключения всегда заключён в скобки
- Он всегда представляет тип исключения, который обрабатывает блок
- Код обработки исключения пишется между двумя фигурными скобками {}
- Можно разместить несколько блоков except в одном блоке try
- Блок except можно использовать только после блока try
- Все блоки except должны быть упорядочены от подкласса к суперклассу исключения
Пример:
try {
} catch (ArrayIndexOutOfBoundsException e) {
System.err.printin("Caught first " + e.getMessage());
} catch (IOException e) {
System.err.printin("Caught second " + e.getMessage());
}
Оператор finally в Python
Блок finally всегда выполняется независимо от того, было ли выброшено исключение или нет. Ключевое слово finally позволяет создать блок кода, следующий за блоком try-catch.
Блок finally опционален. Он предназначен для определения действий очистки, которые должны выполняться во всех условиях.
try:
raise KeyboardInterrupt
finally:
print('welcome, world!')
# Output:
# Welcome, world!
# KeyboardInterrupt
Блок finally выполняется перед завершением try.
Оператор raise в Python
Оператор raise указывает аргумент, инициализирующий объект исключения. Здесь после имени исключения следует запятая, и аргумент или кортеж аргументов, следующих за запятой.
Синтаксис:
raise [Exception [, args [, traceback]]]
В этом синтаксисе аргумент опционален, и во время выполнения значение аргумента исключения всегда равно none.
Пример:
Исключение Python может быть любым значением: строкой, классом, числом или объектом. Большинство исключений, вызываемых ядром Python, являются классами с аргументом, являющимся экземпляром класса.
Важные ошибки Python
| Тип ошибки | Описание |
|---|---|
| ArithmeticError | Базовый класс для всех арифметических исключений. Вызывается при ошибках в арифметических операциях. |
| ImportError | Вызывается при попытке импорта несуществующего модуля. Возникает при опечатке в имени модуля или если модуль не в стандартном пути. |
| IndexError | Вызывается при обращении к последовательности за пределами диапазона. |
| KeyError | Когда конкретный ключ не найден в словаре, вызывается KeyError. |
| NameError | Вызывается, когда имя используется в коде, но никогда не существовало в локальном или глобальном пространстве имён. |
| ValueError | Вызывается, когда функция или встроенная операция получает аргумент правильного типа, но неподходящего значения. |
| EOFError | Возникает, когда одна из встроенных функций (input() или raw_input()) достигает EOF без чтения данных. |
| ZeroDivisionError | Вызывается при делении или взятии остатка от деления на ноль для всех числовых типов. |
| IOError | Вызывается при неудачной операции ввода/вывода. |
| SyntaxError | Вызывается при ошибке в синтаксисе Python. |
| IndentationError | Вызывается при неправильно определённых отступах. |
Другие важные исключения Python
| Исключение | Описание |
|---|---|
| ArithmeticException | Арифметическая ошибка, например деление на ноль. |
| ArrayIndexOutOfBoundsException | Индекс массива вне границ. |
| ArrayStoreException | Присваивание элементу массива несовместимого типа. |
| ClassCastException | Неверное приведение типа. |
| IllegalMonitorStateException | Незаконная операция монитора, например ожидание на разблокированном потоке. |
| IllegalStateException | Окружение или приложение в неправильном состоянии. |
| ClassNotFoundException | Класс не найден. |
| CloneNotSupportedException | Попытка клонировать объект, не реализующий интерфейс Cloneable. |
| IllegalAccessException | Доступ к классу запрещён. |
| InstantiationException | Возникает при попытке создать объект интерфейса или абстрактного класса. |
| CloneNotSupportedException | Попытка клонировать объект, не реализующий интерфейс. |
Ошибка против Исключений
| Ошибка | Исключения |
|---|---|
| Все ошибки в Python — непроверяемые (unchecked). | Исключения включают как проверяемые, так и непроверяемые типы. |
| Ошибки происходят во время выполнения, неизвестные компилятору. | Исключения можно восстановить, обрабатывая их с помощью блоков try-catch. |
| Ошибки в основном вызваны средой, в которой работает приложение. | Само приложение вызывает исключения. |
| Примеры: OutOfMemoryError | Примеры: Checked Exceptions, SQL exception, NullPointerException и т.д. |
Резюме
- Исключение — ошибка, возникшая во время выполнения программы.
- Исключение указывает на то, что, хотя событие может произойти, этот тип события случается редко.
- Распространённые примеры: 1) Деление на ноль, 2) Доступ к несуществующему файлу, 3) Сложение несовместимых типов.
- Исключение — объект Python, представляющий ошибку.
- Оператор try включает try, двоеточие и блок кода, где могут возникнуть исключения. Имеет один или несколько блоков except.
- Блоки except принимают один аргумент — тип исключения для перехвата.
- Оператор raise указывает аргумент, инициализирующий объект исключения.
- Блок finally всегда выполняется независимо от выброса исключения.
Python
- Освоение типов данных в Python: практическое руководство
- Мастерство операторов Python: Полное руководство
- Оператор pass в Python: практическое руководство
- Аргументы функций в Python: позиционные, именованные и параметры по умолчанию
- Словари в Python: создание, манипуляции и продвинутые техники
- Обработка исключений в Python: try, except, else и finally подробно
- Итераторы в Python: как они работают и как создать свои
- Замыкания в Python: как вложенные функции захватывают переменные
- Обработка исключений в Java: try, catch, finally, throw и throws
- Обработка исключений в Java: try-catch-finally и try-with-resources