Использование исключений для предотвращения аварийного завершения программы
Правильная обработка ошибок особенно важна в том случае, если программа должна продолжить работу после возникновения ошибки. Такая ситуация часто встречается в программах, запрашивающих данные у пользователя. Если программа правильно среагировала на некорректный ввод, она может запросить новые данные после сбоя.
Создадим простой калькулятор, который выполняет только операцию деления:
division.py
print("Give me two numbers, and I'll divide them.")
print("Enter 'q' to quit.")
while True:
(1) . .first_number = input(" First number: ")
. .if first_number == 'q':
. . . .break
(2) . .second_number = input("Second number: ")
. .if second_number == 'q':
. . . .break
(3) . .answer = int(first_number) / int(second_number)
. .print(answer)
Программа запрашивает у пользователя первое число first_number (1) , а затем, если пользователь не ввел q для завершения работы, запрашивает второе число second_number (2). Далее одно число делится на другое для получения результата answer (3). Программа никак не обрабатывает ошибки, так что попытка деления на ноль приводит к ее аварийному завершению:
Give me two numbers, and I'll divide them.
Enter 'q' to quit.
First number: 5
Second number: 0
Traceback (most recent call last):
File "division.py", line 9, in <module>
. .answer = int(first_number) / int(second_number)
ZeroDivisionError: division by zero
Конечно, аварийное завершение — это плохо, но еще хуже, если пользователь увидит данные трассировки. Неопытного пользователя они собьют с толку, а при сознательной попытке взлома злоумышленник сможет получить из них больше информации, чем вам хотелось бы. Например, он узнает имя файла программы и увидит некорректно работающую часть кода. На основании этой информации опытный хакер иногда может определить, какие атаки следует применять против вашего кода.