Задать вопрос
dkpage
@dkpage
Учусь

Как правильно обрабатывать ошибки при чтении файла?

Пытаюсь понять как правильно обработать ошибки при чтении файла и собственно закрыть его.
Нужно открыть файл и если ошибка то программа завершает работу, если успешно то выполняет операции над файлом.
Гуглил на просторах интернета и нашел два вариант:
try:
        file = open("config.json", "r")
        config = json.load(file)
        print(config)
    except FileNotFoundError:
        print(">>> Файл не найден!")
    except PermissionError:
        print(">>> Доступ запрещен!")
    finally:
        print(">>> Файл закрылся!")
        file.close()

Но python ругается, что не видит file в finally (UnboundLocalError: cannot access local variable 'file' where it is not associated with a value)
Потом наткнулся на такой вариант:
try:
    myfile = open("config.json", "r")
    try:
        print("Работа с файлом")
    finally:
        print("Файл закрылся")
        myfile.close()
except Exception as ex:
    print(ex)

Но и тут во втором try-finally код не выполняется в finally (в консоле не выводит print)
Нужно ли закрывать файл при исключениях и как это делать правильно?
  • Вопрос задан
  • 102 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 3
Vindicar
@Vindicar
RTFM!
Тебе правильно написали про with, а я добавлю в чём проблема:
# допустим, это наш код
    try:
        file = open("config.json", "r")  # исключение может произойти тут
        config = json.load(file)  # или тут
        print(config)
    except FileNotFoundError:
        print(">>> Файл не найден!")
    except PermissionError:
        print(">>> Доступ запрещен!")
    finally:
        print(">>> Файл закрылся!")
        file.close()

У тебя две разные ошибки, на которые требуются разные реакции.
Если исключение произойдёт в open(), то переменная file не будет создана, так как до присваивания дело просто не дойдёт. Если же исключение произойдёт в load(), то переменная file будет существовать, файл бдует открыт, и его нужно будет закрыть. Таким образом, тебе нужно или обработать эти ошибки отдельно, или использовать другие средства (вроде оператора with) для закрытия файла.
Ответ написан
Комментировать
@dim5x
ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
Использовать with.

try:
    with open('test.txt', 'r') as file:
        print("File exists and is accessible.")
except FileNotFoundError:
    print("File does not exist.")
except PermissionError:
    print("File exists but cannot be accessed.")
Ответ написан
Комментировать
@Everything_is_bad
освой уже гугл, через который бы ты узнал про with open() и перестал бы мучатся с close
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы