Найти в Дзене

День 93. Обработка ошибок и исключений. Конструкция try.. except…finally

При программировании на Python мы можем столкнуться с двумя типами ошибок. Первый тип представляет синтактические ошибки (syntax error). Они появляются в результате нарушения синтаксиса языка программирования при написании исходного кода. При наличии таких ошибок программа не может быть скомпилирована. При работе в какой-либо среде разработки, например, в PyCharm, IDE сама может отслеживать синтактические ошибки и каким-либо образом их выделять. Второй тип ошибок представляют ошибки выполнения (runtime error). Они появляются в уже скомпилированной программе в процессе ее выполнения. Подобные ошибки еще называются исключениями. Например, мы рассматривали преобразование строки в число: Данный скрипт успешно скомпилируется и выполнится, так как строка “5” вполне может быть конвертирована в число. Однако возьмем другой пример: При выполнении этого скрипта будет выброшено исключение ValueError, так как строку “Hello”нельзя преобразовать в число: С одной стороны, здесь очевидно, что строка н
Оглавление

Python . Обработка ошибок и исключений. Конструкция try.. except…finally.

При программировании на Python мы можем столкнуться с двумя типами ошибок. Первый тип представляет синтактические ошибки (syntax error). Они появляются в результате нарушения синтаксиса языка программирования при написании исходного кода. При наличии таких ошибок программа не может быть скомпилирована. При работе в какой-либо среде разработки, например, в PyCharm, IDE сама может отслеживать синтактические ошибки и каким-либо образом их выделять. Второй тип ошибок представляют ошибки выполнения (runtime error). Они появляются в уже скомпилированной программе в процессе ее выполнения. Подобные ошибки еще называются исключениями. Например, мы рассматривали преобразование строки в число:

-2

Данный скрипт успешно скомпилируется и выполнится, так как строка “5” вполне может быть конвертирована в число. Однако возьмем другой пример:

-3

При выполнении этого скрипта будет выброшено исключение ValueError, так как строку “Hello”нельзя преобразовать в число:

-4

С одной стороны, здесь очевидно, что строка не представляет число, но мы можем иметь дело с вводом пользователя, который также может ввести не совсем то, что мы ожидаем:

-5

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

Python . try.. except.

Конструкция try..except имеет следующее формальное определение:

try:

инструкции

except [тип исключения]:

инструкции

Весь основной код, в котором потенциально может возникнуть исключение, помещается после ключевого слова try. Если в этом коде генерируется исключение, то работа кода в блоке try прерывается, и выполнение переходит в блок except. После ключевого слова except опционально можно указать, какое исключение будет обрабатываться (например, ValueError или KeyError). После слова except на следующей строке идут инструкции блока except, выполняемые при возникновении исключения. Рассмотрим обработку исключения на примере преобразования строки в число:

-6

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

Вот как выглядит блок try-except для обработки исключений ZeroDivisionError:

-7

Команда print(5/0), порождающая ошибку, находится в блоке try. Если код в блоке try выполнен успешно, то Python пропускает блок except. Если код в блоке try порождает ошибку, то Python ищет блок except с соответствующей ошибкой и выпускает код в этом блоке. В этом примере код блока try порождает ошибку ZeroDivisionError, поэтому Python ищет блок except с описанием того, как следует действовать в такой ситуации. При выполнении кода этого блока пользователь видит понятное сообщение об ошибке вместо данных трассировки

Python . Блок finally.

При обработке исключений также можно использовать необязательный блок finally. Отличительной особенностью этого блока является то, что он выполняется вне зависимости, было ли сгенерировано исключение:

-8

Как правило, блок finally применяется для освобождения используемых ресурсов, например, для закрытия файлов.