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



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

word_count.py

def count_words(filename):

    """Подсчет приблизительного количества строк в файле."""



try:

with open(filename) as f_obj:

contents = f_obj.read()

except FileNotFoundError:

msg = "Sorry, the file " + filename + " does not exist."

print(msg)

else:

# Подсчет приблизительного количества строк в файле.



words = contents.split()

num_words = len(words)

print("The file " + filename + " has about " + str(num_words) +

" words.")

filename = 'alice.txt'

count_words(filename)

Бульшая часть кода не изменилась. Мы просто снабдили код отступом и пере-

местили его в тело 

count_words()

. Кроме того, комментарий был преобразован 

в строку документации .

Теперь мы можем написать простой цикл для подсчета слов в любом тексте, 

который нужно проанализировать. Для этого имена анализируемых файлов со-

храняются в списке, после чего для каждого файла в списке вызывается функ-

ция 

count_words()



. Мы попробуем подсчитать слова в «Алисе в Стране чудес», 

«Сиддхартхе», «Моби Дике» и «Маленьких женщинах» — все эти книги есть 

в свободном доступе. Я намеренно не стал копировать файл 

siddhartha .txt

 в каталог 

с программой 

word_count .py

, чтобы выяснить, насколько хорошо наша программа 

справляется с отсутствием файла:

def count_words(filename):

...

filenames = ['alice.txt', 'siddhartha.txt', 'moby_dick.txt', 'little_women.txt']



for filename in filenames:

    count_words(filename)

Отсутствие файла 

siddhartha .txt

 не влияет на выполнение программы:

The file alice.txt has about 29461 words.

Sorry, the file siddhartha.txt does not exist.

The file moby_dick.txt has about 215136 words.

The file little_women.txt has about 189079 words.



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

Использование блока 

try

-

except



 в этом примере дает два важных преимущества: 

программа ограждает пользователя от вывода трассировки и продолжает выполне-

ние, анализируя тексты, которые ей удается найти. Если бы в программе не пере-

хватывалось исключение 

FileNotFoundError

, инициированное из-за отсутствия 

siddhartha .txt

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

прервалась бы после попытки подсчитать слова в тексте «Сиддхартхи»; до анализа 

«Моби Дика» или «Маленьких женщин» дело не дошло бы.

Ошибки без уведомления пользователя

В предыдущем примере мы сообщили пользователю о том, что один из файлов ока-

зался недоступен. Тем не менее вы не обязаны сообщать о каждом обнаруженном 

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

проигнорировать сбой и продолжать работу, словно ничего не произошло. Для 

этого блок 

try

 пишется так же, как обычно, но в блоке 



except

 вы явно приказыва-

ете Python не предпринимать никаких особых действий в случае ошибки. В языке 

Python существует команда 

pass

, с которой блок ничего не делает:



def count_words(filename):

"""Подсчет приблизительного количества строк в файле."""

try:

...


except FileNotFoundError:

        pass



else:

...


filenames = ['alice.txt', 'siddhartha.txt', 'moby_dick.txt', 'little_women.txt']

for filename in filenames:

count_words(filename)

Единственное отличие этого листинга от предыдущего — команда 

pass

 в точке . 



Теперь при возникновении ошибки 

FileNotFoundError

 выполняется код в блоке 

except


, но при этом ничего не происходит. Программа не выдает данные трасси-

ровки и вообще никакие результаты, указывающие на возникновение ошибки. 

Пользователи получают данные о количестве слов во всех существующих файлах, 

однако ничто не сообщает о том, что какой-то файл не был найден:

The file alice.txt has about 29461 words. 

The file moby_dick.txt has about 215136 words. 

The file little_women.txt has about 189079 words.

Команда 


pass

 также может служить временным заполнителем. Она напоминает, 

что в этот конкретный момент выполнения вашей программы вы решили ниче-

го не предпринимать, хотя, возможно, сделаете что-то позднее. Например, эта 

программа может записать все имена отсутствующих файлов в файл с именем 

missing_files .txt

. Пользователи этот файл не увидят, но создатель программы сможет 

прочитать его и разобраться с отсутствующими текстами.




Исключения    203

О каких ошибках нужно сообщать?

Как определить, в каком случае следует сообщить об ошибке пользователю, а когда 

можно просто проигнорировать ее незаметно для пользователя? Если пользователь 

знает, с какими текстами должна работать программа, вероятно, он предпочтет по-

лучить сообщение, объясняющее, почему некоторые тексты были пропущены при 

анализе. Пользователь ожидает увидеть какие-то результаты, но не знает, какие 

книги должны быть проанализированы? Возможно, ему и не нужно знать о недо-

ступности каких-то файлов. Лишняя информация только сделает вашу программу 

менее удобной для пользователя. Средства обработки ошибок Python позволяют 

достаточно точно управлять тем, какой объем информации следует предоставить 

пользователю.

Хорошо написанный, правильно протестированный код редко содержит внутрен-

ние ошибки (например, синтаксические или логические). Но в любой ситуации, 

в которой ваша программа зависит от внешних факторов (пользовательского ввода, 

существования файла, доступности сетевого подключения), существует риск воз-

никновения исключения. С накоплением практического опыта вы начнете видеть, 

в каких местах программы следует разместить блоки обработки исключений 

и сколько информации предоставлять пользователям о возникающих ошибках.



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




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

    Басты бет