Это продолжение статьи Исключения в Python. Введение
Следующая задача. Допустим, данные необходимо получить не с помощью консольного ввода, а построчно считать из файла и добавить обработанный результат в тот же файл. И если в процессе чтения / обработки возникнет ошибка, то, помимо стандартного сообщения об ошибке, необходимо также в любом случае закрыть этот текстовой файл.
Для тестирования этого кода понадобится добавить в текущий каталог программы текстовой файл tmp.txt следующего содержания:
5
7
В коде, представленом ниже, происходит открытие файла, обработка строк (в данном случае, это деление числа 10 на целое число, взятое из соответствющей строки файла), накопление результата для выгрузки в файл в переменной output и, наконец, добавление полученного результата в конец текстового файла:
try:
f = open('tmp.txt', 'r+')
output = ''
for line in f:
num = int(line)
result = 10 / num
output += f'{result}\n'
f.write(output)
except Exception as e:
print(e.__class__, e)
finally:
print('f.closed = ', f.closed)
f.close()
print('f.closed = ', f.closed)
Если мы сейчас запустим этот код, то он отработает без ошибок, и на печать будет выведено:
>>>
f.closed = False
f.closed = True
А текстовой файл tmp.txt увеличится на две новых строки:
>>>
5
7
2.0
1.4285714285714286
Эти добавленные строки - дробные числа в строковом формате. Поэтому, если мы ещё раз запустим скрипт, то на этот раз получим ошибку и сообщение:
>>>
<class 'ValueError'> invalid literal for int() with base 10: '2.0\n'
f.closed = False
f.closed = True
Однако, как мы видим, не смотря наличие или отсутствие ошибок исполнения кода, и в первом и во втором случае был выполнен блок finally: файл был закрыт с выводом соответствующего сообщения: f.closed = True.
Продолжить в статье Исключения в Python. Перехват специфических ошибок
Вернуться в начало, на статью Исключения в Python. Введение