Исключения возникают, когда происходит непредвиденное событие, нарушающее нормальный поток выполнения программы. Обработка исключений позволяет избежать аварийного завершения программы и обработать ошибки корректно.
Конструкция try-except
Основная конструкция для обработки исключений в Python выглядит следующим образом:
try:
# Блок кода, где возможно возникновение исключения
except ExceptionType:
# Обработчик исключения
finally:
# Этот блок выполняется всегда, независимо от наличия исключения
Если исключение возникает в блоке try, управление передается в соответствующий блок except. Если исключение не возникает, блок finally выполняется после блока try.
Примеры исключений
Некоторые распространенные исключения в Python:
ZeroDivisionError— попытка деления на ноль.ValueError— неверное значение аргумента.IndexError— выход индекса за пределы допустимых значений.KeyError— отсутствие ключа в словаре.IOError— ошибка ввода-вывода.
| Категория исключения | Примеры исключений | Типичные сценарии возникновения |
| Арифметические ошибки | ZeroDivisionError, OverflowError | Деление на ноль, вычисления с очень большими числами |
| Ошибки индексации | IndexError, KeyError | Доступ к несуществующему индексу списка, отсутствующему ключу словаря |
| Ошибки ввода-вывода | FileNotFoundError, PermissionError | Файл не найден, недостаточно прав для доступа |
| Ошибки типизации | TypeError, ValueError | Передача строки вместо числа, преобразование некорректных данных |
| Ошибки импорта | ImportError, ModuleNotFoundError | Модуль не найден, циклические импорты |
20 типов встроенных исключений в Python
Иерархия классов для встроенных исключений в Python выглядит так:
BaseException
SystemExit
KeyboardInterrupt
GeneratorExit
Exception
ArithmeticError
AssertionError
...
...
...
ValueError
Warning
Все исключения в Python наследуются от базового BaseException:
SystemExit— системное исключение, вызываемое функциейsys.exit()во время выхода из приложения;KeyboardInterrupt— возникает при завершении программы пользователем (чаще всего при нажатии клавиш Ctrl+C);GeneratorExit— вызывается методомcloseобъектаgenerator;Exception— исключения, которые можно и нужно обрабатывать (предыдущие были системными и их трогать не рекомендуется).
От Exception наследуются:
1 StopIteration — вызывается функцией next в том случае если в итераторе закончились элементы;
2. ArithmeticError — ошибки, возникающие при вычислении, бывают следующие типы:
FloatingPointError— ошибки при выполнении вычислений с плавающей точкой (встречаются редко);OverflowError— результат вычислений большой для текущего представления (не появляется при операциях с целыми числами, но может появиться в некоторых других случаях);ZeroDivisionError— возникает при попытке деления на ноль.
3. AssertionError — выражение, используемое в функции assert неверно;
4. AttributeError — у объекта отсутствует нужный атрибут;
5. BufferError — операция, для выполнения которой требуется буфер, не выполнена;
6. EOFError — ошибка чтения из файла;
7. ImportError — ошибка импортирования модуля;
8. LookupError — неверный индекс, делится на два типа:
IndexError— индекс выходит за пределы диапазона элементов;KeyError— индекс отсутствует (для словарей, множеств и подобных объектов);
9. MemoryError — память переполнена;
10. NameError — отсутствует переменная с данным именем;
11. OSError — исключения, генерируемые операционной системой:
ChildProcessError— ошибки, связанные с выполнением дочернего процесса;ConnectionError— исключения связанные с подключениями (BrokenPipeError, ConnectionResetError, ConnectionRefusedError, ConnectionAbortedError);FileExistsError— возникает при попытке создания уже существующего файла или директории;FileNotFoundError— генерируется при попытке обращения к несуществующему файлу;InterruptedError— возникает в том случае если системный вызов был прерван внешним сигналом;IsADirectoryError— программа обращается к файлу, а это директория;NotADirectoryError— приложение обращается к директории, а это файл;PermissionError— прав доступа недостаточно для выполнения операции;ProcessLookupError— процесс, к которому обращается приложение не запущен или отсутствует;TimeoutError— время ожидания истекло;
12. ReferenceError — попытка доступа к объекту с помощью слабой ссылки, когда объект не существует;
13. RuntimeError — генерируется в случае, когда исключение не может быть классифицировано или не подпадает под любую другую категорию;
14. NotImplementedError — абстрактные методы класса нуждаются в переопределении;
15. SyntaxError — ошибка синтаксиса;
16. SystemError — сигнализирует о внутренне ошибке;
17. TypeError — операция не может быть выполнена с переменной этого типа;
18. ValueError — возникает когда в функцию передается объект правильного типа, но имеющий некорректное значение;
19. UnicodeError — исключение связанное с кодирование текста в unicode, бывает трех видов:
UnicodeEncodeError— ошибка кодирования;UnicodeDecodeError— ошибка декодирования;UnicodeTranslateError— ошибка переводаunicode.
20. Warning — предупреждение, некритическая ошибка.
💭 Посмотреть всю цепочку наследования конкретного типа исключения можно с помощью модуля inspect:
import inspect
print(inspect.getmro(TimeoutError))
> (<class 'TimeoutError'>, <class 'OSError'>, <class 'Exception'>, <class 'BaseException'>, <class 'object'>)
Пример обработки исключения
Рассмотрим пример обработки исключения при делении на ноль:
try:
result = 10 / 0
except ZeroDivisionError:
print("Ошибка: деление на ноль!")
finally:
print("Выполнение закончено.")
В этом примере программа попытается разделить 10 на 0, что приведет к возникновению исключения ZeroDivisionError. Программа обработает это исключение, выведя сообщение об ошибке, и завершится сообщением «Выполнение закончено.»
Источники: https://stepik.org/lesson/1582392/step/2?unit=1603745 / https://pythonchik.ru/osnovy/python-try-except
Исключения в процессе работы с файлами
1. FileNotFoundError
Возникает, когда указанный файл не существует или путь к нему неверен.
try:
with open('nonexistent_file.txt', 'r') as file:
content = file.read()
except FileNotFoundError:
print("Файл не найден.")
2. IOError
Общее исключение, которое возникает при возникновении проблем с вводом-выводом. Оно включает в себя многие специфичные исключения, такие как FileNotFoundError, PermissionError и другие.
try:
with open('file.txt', 'r') as file:
content = file.read()
except IOError as e:
print(f"Произошла ошибка ввода-вывода: {e}")
3. OSError
Базовое исключение для системных ошибок, возникающих при работе с файлами. Может включать в себя различные конкретные ошибки, такие как FileExistsError, IsADirectoryError и другие.
try:
with open('file.txt', 'r') as file:
content = file.read()
except OSError as e:
print(f"Системная ошибка: {e}")
4. PermissionError
Возникает, когда у вас нет необходимых прав для открытия или чтения файла.
try:
with open('/restricted/file.txt', 'r') as file:
content = file.read()
except PermissionError:
print("Нет разрешения на открытие файла.")
5. UnicodeDecodeError
Возникает, когда Python не может декодировать байты в строку с использованием указанного кодировки.
try:
with open('utf8_file.txt', encoding='utf-8') as file:
content = file.read()
except UnicodeDecodeError:
print("Ошибка декодирования файла.")
6. EOFError
Возникает, когда достигается конец файла при чтении.
try:
while True:
line = input()
except EOFError:
print("Конец файла достигнут.")
7. ValueError
Может возникнуть, если указано неправильное значение параметра при открытии файла, например, неправильный режим.
try:
with open('file.txt', mode='invalid_mode') as file:
content = file.read()
except ValueError:
print("Неправильный режим открытия файла.")
Заключение
При работе с файлами в Python важно предусмотреть обработку возможных исключений, чтобы предотвратить сбои в вашем приложении. Используйте блоки try-except для перехвата и обработки этих исключений, чтобы обеспечить устойчивость вашего кода.
Источники: https://stepik.org/lesson/1582392/step/10?unit=1603745
Было ли это полезно?
0 / 0