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 позволяют
достаточно точно управлять тем, какой объем информации следует предоставить
пользователю.
Хорошо написанный, правильно протестированный код редко содержит внутрен-
ние ошибки (например, синтаксические или логические). Но в любой ситуации,
в которой ваша программа зависит от внешних факторов (пользовательского ввода,
существования файла, доступности сетевого подключения), существует риск воз-
никновения исключения. С накоплением практического опыта вы начнете видеть,
в каких местах программы следует разместить блоки обработки исключений
и сколько информации предоставлять пользователям о возникающих ошибках.
Достарыңызбен бөлісу: |