Описание
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 - предупреждение.