Обработка исключений в Python
При возникновении ошибки времени выполнения Python создает (возбуждает) специальный объект - исключение, который позволяет однозначно характеризовать возникшую ошибочную ситуацию. Выбор подходящего исключения происходит из встроенной иерархии классов-исключений (фрагмент):
BaseException(базовое исключение)SystemExit(исключение, порождаемое функциейsys.exit()при выходе из программы)KeyboardInterrupt(прерывании программы пользователем,Ctrl+C)Exception(базовое несистемное исключение)ArithmeticError(арифметическая ошибка)FloatingPointError(неудачное выполнение операции с плавающей запятой)OverflowError(результат арифметической операции слишком велик для представления)ZeroDivisionError(деление на ноль)
LookupError(некорректный индекс или ключ)IndexError(индекс не входит в диапазон элементов)KeyError(несуществующий ключ)
MemoryError(недостаточно памяти)NameError(не найдено переменной с таким именем)OSError(ошибка, связанная с ОС - есть подклассы, напримерFileNotFoundError)SyntaxError(синтаксическая ошибка, включает классыIndentationErrorиTabError)SystemError(внутренняя ошибка)TypeError(операция применена к объекту несоответствующего типа)ValueError(аргумент правильного типа, но некорректного значения)
Пример встроенного возбуждения исключения:
Конструкция try
tryПридерживаясь идеологии «Легче попросить прощения, чем разрешения», Python предусматривает конструкцию try для обработки возникающих исключений.
tryexceptelsefinally
Ход выполнения:
код, который потенциально может привести к ошибке, помещается в блок
try;в случае ошибки, код немедленно завершается и переходит в обработчик
except(если он указан для соответствующего исключения);
Наиболее простой способ обработки исключений
Подобный вариант обработки исключений не рекомендуется, т.к. блок except будет перехватывать любое исключение, что не позволит точно определить ошибку в коде. Улучшить код можно, добавив обработку исключения по классу (Листинг 7.1.4).
Обработка общего класса исключений Exception
Рекомендуемым способом обработки исключений является как можно большая конкретизация класса исключения.
Обработка конкретных классов исключений
Возбуждение исключений (raise)
raise)Исключения являются не только механизмом обработки ошибок, но и удобным средством управления потоком выполнения. Так, необходимое исключение можно возбудить вручную, когда это необходимо, используя конструкцию raise.
raise
Возбуждаемое исключение может быть как встроенным (если соответствует по смыслу), так и пользовательским (создаваемым самостоятельно).
В Листинге 7.1.6 приведен пример использование оператора raise.
Листинг 7.1.6 - Использование raise для управления потоком выполнения | скачать
Особенности обработки исключений внутри функций
Обработка исключений аналогично производится и внутри функций, однако, необходимо писать код так, чтобы вызывающий код знал о случившемся, если это влияет на его дальнейшую работу.
Разница в обработке исключений приведена в Листинге 7.1.7.
Листинг 7.1.7 - Различная обработка исключений в функции | скачать
Last updated