Исключения
Программисты всегда должны учитывать возможность возникновения ошибок в программе. Примеров может быть бесчисленное множество: функция может не получить ожидаемую информацию, необходимые ресурсы могут быть потеряны или сетевое соединение может быть прервано. Разрабатывая систему, программист должен предвидеть возможные исключительные ситуации и принимать соответствующие меры для их обработки.
Не существует единого правильного способа обработки ошибок в программах. Программы, предназначенные для предоставления определённых услуг, таких как веб-серверы, должны быть устойчивыми к ошибкам, регистрировать их в журнале для последующего анализа и продолжать принимать новые запросы как можно дольше. С другой стороны, интерпретатор Python немедленно завершает работу и печатает сообщение об ошибке, что облегчает программисту обработку ошибки при её возникновении. В любом случае программист должен решить, как программа должна реагировать на исключительные условия.
Исключения являются темой этого раздела и предоставляют общий механизм для обработки ошибок программы. Создание исключения — это способ остановить нормальное выполнение программы, отправить сигнал о возникновении исключительной ситуации и немедленно вернуться к закрытому блоку кода, предназначенному для обработки исключений. Интерпретатор Python генерирует исключение каждый раз, когда обнаруживает ошибку в операторе или выражении. Пользователи также могут использовать операторы raise или assert для генерации исключений.
Генерация исключений. Исключение — это объект, класс которого прямо или косвенно наследуется от класса BaseException. Оператор assert, представленный в первой главе, создаёт исключение типа AssertionError. Обычно исключения создаются с помощью оператора raise. Общая форма оператора raise описана в документации Python. Наиболее распространённое использование raise заключается в создании экземпляра исключения и его генерации.
Когда возникает исключение, текущий блок кода не продолжает выполняться. Если исключение не обрабатывается (будет описано ниже), интерпретатор немедленно возвращается к интерактивному циклу чтения-оценки-печати или полностью завершается, если Python был запущен с файлом в качестве аргумента. Кроме того, интерпретатор печатает трассировку стека, которая представляет собой структурированный текстовый блок, описывающий последовательность вложенных функций выполнения в месте возникновения исключения. В приведённом выше примере имя файла указывает на то, что исключение было создано пользователем во время интерактивного сеанса, а не кодом в файле.
Обработка исключений. Исключения могут обрабатываться с помощью закрытого оператора try. Оператор try состоит из нескольких предложений, первое из которых начинается с try, а остальные начинаются с except.
При выполнении оператора try предложение всегда выполняется немедленно. Предложение except suite выполняется только тогда, когда в предложении возникает исключение. Каждое предложение except указывает конкретный класс исключений, которые необходимо обработать. Например, если является AssertionError, то будут обработаны все экземпляры классов, производных от AssertionError; идентификатор привязан к созданному объекту исключения, но эта привязка не действует вне предложения .
Например, мы можем использовать оператор try для обработки исключения и привязки x к 0 при возникновении исключения.
Оператор try может обрабатывать исключения, возникающие в теле функции, вызываемой в предложении . Когда возникает исключение, поток управления немедленно переходит к ближайшему предложению , которое может обработать этот тип исключения.
Этот пример показывает, что выражение print в функции invert никогда не оценивается, вместо этого поток управления переходит к предложению handler. Возвращение значения ZeroDivisionError e в виде строки приводит к получению удобочитаемой строки «division by zero».
Сами объекты исключений имеют атрибуты, такие как информация об ошибках в операторе assert и информация о месте возникновения ошибки. Пользовательские классы исключений могут иметь дополнительные атрибуты.
В первой главе мы реализовали метод Ньютона для поиска нулей любой функции. Следующий пример определяет класс исключения, который возвращает наилучшее предположение, сделанное в процессе улучшения, всякий раз, когда возникает ValueError. Математическая ошибка (разновидность ValueError) возникает при вызове sqrt для отрицательного числа. Это исключение обрабатывается путём создания IterImproveError, который сохраняет наилучшее предположение метода Ньютона в качестве параметра.
Сначала мы определяем новый класс, унаследованный от Exception.
Затем мы определяем IterImprove, версию нашего общего алгоритма улучшения. Эта версия обрабатывает любые ValueError, сохраняя последнее предположение с помощью создания исключения IterImproveError. Как и раньше, iter_improve принимает две функции в качестве параметров, каждая из которых принимает один числовой параметр. Функция обновления возвращает новое предположение, а функция done возвращает логическое значение, указывающее, сошлась ли итерация к правильному значению.
Наконец, мы определяем find_root, который возвращает результат iter_improve. iter_improve применяется к функции обновления newton_update. newton_update определяется в первой главе и не требует изменений в этом примере. Версия find_root обрабатывает IterImproveError путём возврата своего последнего предположения.
Рассмотрим использование find_root для поиска нуля функции 2 * x ** 2 + sqrt(x). Нуль этой функции равен 0, но попытка найти его для любого отрицательного числа приведёт к возникновению ValueError. Наша реализация метода Ньютона из первой главы вызовет исключение и не сможет вернуть какое-либо предположение о нуле. Наша пересмотренная реализация вернёт последнее предположение перед ошибкой.
Хотя это приближение всё ещё далеко от правильного ответа 0, некоторые приложения могут предпочесть это приближение, а не ValueError. Исключения — это ещё один приём, который помогает нам разделить детали программы на модули. В этом примере механизм исключений Python позволяет нам отделить логику итеративного улучшения, которая не меняется в блоке try
, и логику обработки ошибок, которая появляется в блоке except
. Также мы обнаружим, что исключения являются очень полезным свойством при использовании интерпретатора Python.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )