Блог

Исключения в Python. Конструкция try-except-finally

Это продолжение статьи Исключения в 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. Введение