Обработка исключений Python
В предыдущем уроке мы узнали об исключениях Python. Мы знаем, что исключения аварийно прекращают выполнение программы.
Поскольку исключения аварийно прекращают выполнение программы, важно обрабатывать исключения. В Python мы используем блок try...except для обработки исключений.
Блок try…except Python
Блок try...except используется для обработки исключений в Python. Вот синтаксис блока try...except:
try:
# код, который может вызвать исключение
except:
# код, который выполняется при возникновении исключения
Здесь мы поместили код, который может вызвать исключение, внутрь блока try. За каждым блоком try следует блок except.
Когда возникает исключение, оно перехватывается блоком except. Блок except нельзя использовать без блока try.
Пример: обработка исключений с помощью try…except
try:
numerator = 10
denominator = 0
result = numerator/denominator
print(result)
except:
print("Error: Denominator cannot be 0.")
# Вывод: Error: Denominator cannot be 0.
В этом примере мы пытаемся разделить число на 0. Здесь этот код генерирует исключение.
Чтобы обработать исключение, мы поместили код result = numerator/denominator внутрь блока try. Теперь, когда возникает исключение, остальной код внутри блока try пропускается.
Блок except перехватывает исключение, и инструкции внутри блока except выполняются.
Если ни одна из инструкций в блоке try не генерирует исключение, блок except пропускается.
Перехват конкретных исключений в Python
Для каждого блока try может быть ноль или более блоков except. Несколько блоков except позволяют нам обрабатывать каждое исключение по-разному.
Тип аргумента каждого блока except указывает тип исключения, которое он может обработать. Например,
try:
even_numbers = [2,4,6,8]
print(even_numbers[5])
except ZeroDivisionError:
print("Denominator cannot be 0.")
except IndexError:
print("Index Out of Bound.")
# Вывод: Index Out of Bound
В этом примере мы создали список с именем even_numbers.
Поскольку индекс списка начинается с 0, последний элемент списка находится по индексу 3. Обратите внимание на инструкцию,
print(even_numbers[5])
Здесь мы пытаемся получить доступ к значению по индексу 5. Следовательно, возникает исключение IndexError.
Когда исключение IndexError возникает в блоке try,
Исключение
ZeroDivisionErrorпропускается.Выполняется набор кода внутри исключения
IndexError.
try Python с предложением else
В некоторых ситуациях мы можем захотеть выполнить определённый блок кода, если блок кода внутри try выполняется без каких-либо ошибок.
Для этих случаев вы можете использовать необязательное ключевое слово else с инструкцией try.
Рассмотрим пример:
# программа вывода обратного значения чётных чисел
try:
num = int(input("Enter a number: "))
assert num % 2 == 0
except:
print("Not an even number!")
else:
reciprocal = 1/num
print(reciprocal)
Вывод
Если мы передаём нечётное число:
Enter a number: 1
Not an even number!
Если мы передаём чётное число, обратное значение вычисляется и отображается.
Enter a number: 4
0.25
Однако если мы передаём 0, мы получаем ZeroDivisionError, так как блок кода внутри else не обрабатывается предыдущим except.
Enter a number: 0
Traceback (most recent call last):
File "<string>", line 7, in <module>
reciprocal = 1/num
ZeroDivisionError: division by zero
Здесь инструкция assert в коде проверяет, что num — чётное число; если num нечётное, возникает AssertionError, что запускает блок except.
Примечание
Исключения в предложении else не обрабатываются предыдущими предложениями except.
try…finally Python
В Python блок finally всегда выполняется, независимо от того, возникло исключение или нет.
Блок finally необязателен. И для каждого блока try может быть только один блок finally.
Рассмотрим пример,
try:
numerator = 10
denominator = 0
result = numerator/denominator
print(result)
except:
print("Error: Denominator cannot be 0.")
finally:
print("This is finally block.")
Вывод
Error: Denominator cannot be 0.
This is finally block.
В приведённом выше примере мы делим число на 0 внутри блока try. Здесь этот код генерирует исключение.
Исключение перехватывается блоком except. И затем выполняется блок finally.