3 июня 2023 г.
570

Исключения в Python

Описание

Exception — тип данных. Необходим для того, чтобы сообщать об ошибках при исполнении кода программы.

    Блоки:
  • try - для выполнения инструкций, которые могут породить исключение. Хоть блок try и поддерживает более чем одну инструкцию, тем не менее не рекомендуется внутри этого блока размещать более 1 инструкции.
  • except - перехватывает исключения и выполняет команды блока except. При этом перехватывается как само исключение, так и все его потомки. Без аргументов перехватывает все исключения в том числе системные и прерывания с клавиатуры. Не рекомендуется перехватывать все исключения, рекомендуется не выходить выше Exception. Рекомендуется перехватывать исключения по одному, для более точной обработки исключений.
  • finally - выполнение инструкций блока вне зависимости от наличия или отсутствия исключения.
  • else - выполнение инструкций блока осуществляется только в случае, если исключений не было.

Примеры

try:
    x = 1 / int(input())
except ZeroDivisionError:
    print('Деление на 0')
except ValueError:
    print('Нужно вводить целое число')
except Exception:
    print('Другая ошибка')
else:
    print('Если все хорошо выполняется эта часть')
finally:
    print('Всегда выполняется эта часть')
Обработка нескольких исключений одновременно
try:
    x = 1 / int(input())
except (ZeroDivisionError, ValueError) as e:
    print(e)
    c = -1

Принудительная генерация исключений

Для принудительной генерации исключения используется raise.

Пример
a = input()
try:
    if a == '0':
        raise ZeroDivisionError

except ZeroDivisionError:
    print('Деление на 0')

Assertions

Assertions (утверждения) проверяют, является ли условие истинным или ложным. Если условие истинно, то программа продолжает работу, но если ложно, то программа останавливается и возвращает исключение AssertionError.

assert <условие>, <сообщение для вывода если условие ложно>
assert x != 0, "Нельзя делить на 0"

Наследование исключений

Исключения наследуются друг от друга и если в except указано исключение более высокого уровня, то и исключения наследуемые от него тоже будут обрабатываться.

    Частые исключения
  • Exception - используется, если нужно отловить все исключения;
  • ZeroDivisionError - деление на ноль;
  • AssertionError - выражение в функции assert ложно;
  • FileExistsError - попытка создания файла или директории, которая уже существует;
  • TypeError - операция применена к объекту несоответствующего типа;
  • ValueError - функция получает аргумент правильного типа, но некорректного значения.
  • StopIteration - порождается встроенной функцией next, если в итераторе больше нет элементов;
  • ArithmeticError - арифметическая ошибка;
  • FloatingPointError - порождается при неудачном выполнении операции с плавающей запятой. На практике встречается нечасто;
  • OverflowError - возникает, когда результат арифметической операции слишком велик для представления. Не появляется при обычной работе с целыми числами (так как python поддерживает длинные числа), но может возникать в некоторых других случаях;
  • AttributeError - объект не имеет данного атрибута (значения или метода);
  • BufferError - операция, связанная с буфером, не может быть выполнена;
  • EOFError - функция наткнулась на конец файла и не смогла прочитать то, что хотела;
  • ImportError - не удалось импортирование модуля или его атрибута;
  • LookupError - некорректный индекс или ключ;
  • IndexError - индекс не входит в диапазон элементов;
  • KeyError - несуществующий ключ (в словаре, множестве или другом объекте);
  • MemoryError - недостаточно памяти;
  • NameError - не найдено переменной с таким именем;
  • UnboundLocalError - сделана ссылка на локальную переменную в функции, но переменная не определена ранее;
  • OSError - ошибка, связанная с системой;
  • ChildProcessError - неудача при операции с дочерним процессом;
  • ConnectionError - базовый класс для исключений, связанных с подключениями;
  • FileNotFoundError - файл или директория не существует;
  • InterruptedError - системный вызов прерван входящим сигналом;
  • IsADirectoryError - ожидался файл, но это директория;
  • NotADirectoryError - ожидалась директория, но это файл;
  • PermissionError - не хватает прав доступа;
  • ProcessLookupError - указанного процесса не существует;
  • TimeoutError - закончилось время ожидания;
  • ReferenceError - попытка доступа к атрибуту со слабой ссылкой;
  • RuntimeError - возникает, когда исключение не попадает ни под одну из других категорий;
  • NotImplementedError - возникает, когда абстрактные методы класса требуют переопределения в дочерних классах;
  • SyntaxError - синтаксическая ошибка;
  • IndentationError - неправильные отступы;
  • TabError - смешивание в отступах табуляции и пробелов;
  • SystemError - внутренняя ошибка;
  • UnicodeError - ошибка, связанная с кодированием / раскодированием unicode в строках;
  • UnicodeEncodeError - исключение, связанное с кодированием unicode;
  • UnicodeDecodeError - исключение, связанное с декодированием unicode;
  • UnicodeTranslateError - исключение, связанное с переводом unicode;
  • Warning - предупреждение.