1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wizardforcel-sicp-py-zh

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
3.4.md 11 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 29.11.2024 03:42 9c9d71c

Исключения

Программисты всегда должны учитывать возможность возникновения ошибок в программе. Примеров может быть бесчисленное множество: функция может не получить ожидаемую информацию, необходимые ресурсы могут быть потеряны или сетевое соединение может быть прервано. Разрабатывая систему, программист должен предвидеть возможные исключительные ситуации и принимать соответствующие меры для их обработки.

Не существует единого правильного способа обработки ошибок в программах. Программы, предназначенные для предоставления определённых услуг, таких как веб-серверы, должны быть устойчивыми к ошибкам, регистрировать их в журнале для последующего анализа и продолжать принимать новые запросы как можно дольше. С другой стороны, интерпретатор 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».

3.4.1 Объекты исключений

Сами объекты исключений имеют атрибуты, такие как информация об ошибках в операторе 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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/wizardforcel-sicp-py-zh.git
git@api.gitlife.ru:oschina-mirror/wizardforcel-sicp-py-zh.git
oschina-mirror
wizardforcel-sicp-py-zh
wizardforcel-sicp-py-zh
master