Использование исключений для предотвращения аварийного завершения программы

We use cookies. Read the Privacy and Cookie Policy

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

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

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

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