М97 Изучаем Python: программирование игр, визуализация данных, веб-приложения



Pdf көрінісі
бет151/334
Дата18.10.2023
өлшемі6,19 Mb.
#186390
1   ...   147   148   149   150   151   152   153   154   ...   334
Байланысты:
Изучаем Python


Глава 10 • Файлы и исключения
Использование исключений для предотвращения аварийного 
завершения программы
Правильная обработка ошибок особенно важна в том случае, если программа 
должна продолжить работу после возникновения ошибки. Такая ситуация часто 
встречается в программах, запрашивающих данные у пользователя. Если програм-
ма правильно среагировала на некорректный ввод, она может запросить новые 
данные после сбоя.
Создадим простой калькулятор, который выполняет только операцию деления:
division_calculator.py
print("Give me two numbers, and I'll divide them.")
print("Enter 'q' to quit.")
while True:

first_number = input("\nFirst number: ")
if first_number == 'q':
break

second_number = input("Second number: ")
if second_number == 'q':
break

answer = int(first_number) / int(second_number)
print(answer)
Программа запрашивает у пользователя первое число, 
first_number

, а затем, 
если пользователь не ввел 
q
для завершения работы, — второе число, 
second_number

. Далее одно число делится на другое для получения результата 
answer

. Про-
грамма никак не пытается обрабатывать ошибки, так что попытка деления на ноль 
приводит к ее аварийному завершению:
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  
answer = int(first_number) / int(second_number) 
ZeroDivisionError: division by zero 
Конечно, аварийное завершение — это плохо, но еще хуже, что пользователь 
увидит данные трассировки. Неопытного пользователя они собьют с толку, а при 
сознательной попытке взлома злоумышленник сможет получить из них больше 
информации, чем вам хотелось бы. Например, он узнает имя файла программы 
и увидит некорректно работающую часть кода. На основании этой информации 
опытный хакер иногда может определить, какие атаки следует применять против 
вашего кода.


Исключения
209
Блок else
Для повышения устойчивости программы к ошибкам можно заключить строку, вы-
дающую ошибки, в блок 
try
-
except
. Ошибка происходит в строке, выполняющей 
деление; следовательно, именно эту строку следует заключить в блок 
try
-
except

Данный пример также включает блок 
else
. Любой код, зависящий от успешного 
выполнения блока 
try
, размещается в блоке 
else
:
...
while True:
...
if second_number == 'q':
break

try:
answer = int(first_number) / int(second_number)

except ZeroDivisionError:
print("You can't divide by 0!")

else:
print(answer)
Программа пытается выполнить операцию деления в блоке 
try

, который вклю-
чает только код, способный породить ошибку. Любой код, зависящий от успешного 
выполнения блока 
try
, добавляется в блок 
else
. В данном случае, если операция 
деления выполняется успешно, блок 
else
используется для вывода результата 

.
Блок 
except
сообщает Python, как следует поступать при возникновении ошибки 
ZeroDivisionError

. Если при выполнении команды из блока 
try
происходит 
ошибка, связанная с делением на 0, программа выводит понятное сообщение, 
которое объясняет пользователю, как избежать подобных ошибок. Выполнение 
программы продолжается, и пользователь не сталкивается с трассировкой:
Give me two numbers, and I'll divide them. 
Enter 'q' to quit. 
First number: 


Достарыңызбен бөлісу:
1   ...   147   148   149   150   151   152   153   154   ...   334




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет