В процессе программирования мы всегда сталкиваемся с различными родами ошибок. Некоторые ошибки могут быть вызваны нашим кодом. Например синтаксическая ошибка, такую ошибку обычно называют багом. Однако в безглючной программе все равно могут возникать проблемы, потому что некоторые ошибки вызваны не нашим кодом. Они могут быть вызваны случайными ситуациями или операциями и этот тип ошибок называется исключениями.
Например: - Во время записи данных в файлы, диск может быть заполнен и запись на него невозможна. - Когда какие-то данные загружаются, и сеть внезапно разрывается.
Надежный код не только не содержит ошибок, но и хорошо обрабатывает исключения.
Обработки исключений в 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