Книга «Изучаем Python»



Pdf көрінісі
бет105/238
Дата07.01.2022
өлшемі7,86 Mb.
#18670
түріКнига
1   ...   101   102   103   104   105   106   107   108   ...   238
Байланысты:
2 5343781172763690906

division.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 

Конечно, аварийное завершение — это плохо, но еще хуже, если пользователь 

увидит данные трассировки. Неопытного пользователя они собьют с толку, а при 

сознательной попытке взлома злоумышленник сможет получить из них больше 

информации, чем вам хотелось бы. Например, он узнает имя файла программы 

и увидит некорректно работающую часть кода. На основании этой информации 

опытный хакер иногда может определить, какие атаки следует применять против 

вашего кода.

Блок else

Для повышения устойчивости программы к ошибкам можно заключить строку, 

выдающую ошибки, в блок 

try


-

except


. Ошибка происходит в строке, выполняющей 

деление; следовательно, именно эту строку следует заключить в блок 

try

-

except



.

Данный пример также включает блок 

else

. Любой код, зависящий от успешного 



выполнения блока 

try


, размещается в блоке 

else


:

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':




198    Глава 10  •  Файлы и исключения

break


second_number = input("Second number: ")

    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: 5

Second number: 0

You can't divide by 0! 

First number: 5

Second number: 2

2.5 


First number: q

Блок 


try

-

except



-

else


 работает так: Python пытается выполнить код в блоке 

try


В блоках 

try

 следует размещать только тот код, при выполнении которого может 



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

случае, если выполнение 

try

 прошло успешно; такой код размещается в блоке 



else

Блок 



except

 сообщает Python, что делать, если при выполнении кода 

try

 произо-


шло определенное исключение. Заранее определяя вероятные источники ошибок, 

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

вводе некорректных данных или при недоступности ресурсов. Ваш код оказывается 

защищенным от случайных ошибок пользователей и сознательных атак.

Обработка исключения FileNotFoundError

Одна из стандартных проблем при работе с файлами — отсутствие необходимых 

файлов. Тот файл, который вам нужен, может находиться в другом месте, в имени 

файла может быть допущена ошибка, или файл может вообще не существовать. 

Все эти ситуации достаточно прямолинейно обрабатываются в блоках 

try


-

except


.


Исключения    199

Попробуем прочитать данные из несуществующего файла. Следующая програм-

ма пытается прочитать содержимое файла с текстом «Алисы в Стране чудес», но 

я не сохранил файл 

alice .txt

 в одном каталоге с файлом 

alice .py

:



Достарыңызбен бөлісу:
1   ...   101   102   103   104   105   106   107   108   ...   238




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

    Басты бет