Исключения и обработка ошибок

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

Конструкция 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

Общее исключение, которое возникает при возникновении проблем с вводом-выводом. Оно включает в себя многие специфичные исключения, такие как FileNotFoundErrorPermissionError и другие.

try:
    with open('file.txt', 'r') as file:
        content = file.read()
except IOError as e:
    print(f"Произошла ошибка ввода-вывода: {e}")

3. OSError

Базовое исключение для системных ошибок, возникающих при работе с файлами. Может включать в себя различные конкретные ошибки, такие как FileExistsErrorIsADirectoryError и другие.

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