Обработка исключений в Python

Статьи

Обработка исключений в Python

Автор: Fantom, 28 апреля 2022

В процессе программирования мы всегда сталкиваемся с различными родами ошибок. Некоторые ошибки могут быть вызваны нашим кодом. Например синтаксическая ошибка, такую ошибку обычно называют багом. Однако в безглючной программе все равно могут возникать проблемы, потому что некоторые ошибки вызваны не нашим кодом. Они могут быть вызваны случайными ситуациями или операциями и этот тип ошибок называется исключениями.

Например: - Во время записи данных в файлы, диск может быть заполнен и запись на него невозможна. - Когда какие-то данные загружаются, и сеть внезапно разрывается.

Надежный код не только не содержит ошибок, но и хорошо обрабатывает исключения.

Обработки исключений в Python

К счастью, в Python есть встроенный механизм обработки исключений, который помогает нам удобно их обрабатывать. Это механизм try, except, finally.

Давайте посмотрим пример:

a = input("Пожалуйста, введите числитель:")
b = input("Пожалуйста, введите знаменатель:")
try:
    r = int(a) / int(b)
    print('Результат:', r)
except ZeroDivisionError as e:
    print('Исключение:', e)
finally:
    print('Конец')

# Пожалуйста, введите числитель: 5
# Пожалуйста, введите знаменатель: 0
# Исключение: division by zero
# Конец

# Пожалуйста, введите числитель: 1
# Пожалуйста, введите знаменатель: 2
# Результат: 0.5
# Конец

Как показано в приведенном выше примере, когда мы считаем, что в какой-то части кода могут возникать исключения, мы можем обернуть их в конструкцию try. Если исключения действительно случаются, то код в блоке except будет запущен, и независимо от того, произошли исключения или нет, отработает оператор finally.

Ошибок может быть много. Если возникают разные типы ошибок, они должны обрабатываться разными блоками.

Что касается нашего примера, как быть с неправильными входными данными, которые не являются числами?

a = input("Пожалуйста, введите числитель:")
b = input("Пожалуйста, введите знаменатель:")
try:
    r = int(a) / int(b)
    print('Результат:', r)
except ValueError as e:
    print('Исключение:', e)
except ZeroDivisionError as e:
    print('Исключение:', e)
finally:
    print('Конец')

# Пожалуйста, введите числитель: yang
# Пожалуйста, введите знаменатель: 666
# Исключение: invalid literal for int() with base 10: 'yang'
# Конец

Как мы видим, если ввести строку, возникнет ошибка ValueError.

Кроме того, после блока except мы можем добавить блок else. Он сработает, если не произойдет никаких исключений.

a = input("Пожалуйста, введите числитель:")
b = input("Пожалуйста, введите знаменатель:")
try:
    r = int(a) / int(b)
    print('Результат:', r)
except ValueError as e:
    print('Исключение:', e)
except ZeroDivisionError as e:
    print('Исключение:', e)
else:
    print("Нет исключений!")
finally:
    print('Конец')

# Пожалуйста, введите числитель: 2
# Пожалуйста, введите знаменатель: 4
# Результат: 0.5
# Нет исключений!
# Конец

Обратите внимание, блок else сработает если не произойдет никаких исключений, а вот блок finally обязательно сработает, независимо от того, что произошло.

Зачем нам нужен блок finally?

Как упоминалось выше, блок finally будет работать в любом случае. Когда нам нужно убедиться, что что-то будет сделано независимо от того, встретится ли исключение или нет. Например, когда мы открываем файл и выполняем с ним какие-то операции. Мы должны быть уверены, что закроем файл окончательно.

В следующих примерах показано, в чем разница между написанием кода в блоке finally и написанием кода вне его.

a = input("Пожалуйста, введите числитель:")
b = input("Пожалуйста, введите знаменатель:")
try:
    r = int(a) / int(b)
    print('Результат:', r)
except ZeroDivisionError as e:
    print('Исключение:', e)
    exit()
finally:
    print('Конец')

# Пожалуйста, введите числитель: 8
# Пожалуйста, введите знаменатель: 0
# Исключение: division by zero
# Конец

Как показано выше, даже если мы получим исключение ZeroDivisionError, код в блоке finally все равно будет выполняться.

Как насчет того, чтобы убрать ключевое слово finally?

a = input("Пожалуйста, введите числитель:")
b = input("Пожалуйста, введите знаменатель:")
try:
    r = int(a) / int(b)
    print('Результат:', r)
except ZeroDivisionError as e:
    print('Исключение:', e)
    exit()
print('Конец')

# Пожалуйста, введите числитель: 8
# Пожалуйста, введите знаменатель: 0
# Исключение: division by zero

Вышеупомянутая программа уже завершила работу до запуска print('Конец')!, и вы не увидите сообщения.

Перевод: medium.com Автор: Yang Zhou

Комментарии

Markdown
Войти