← Назад к вопросам

Как выглядит обработка исключений для работы с файлами?

1.0 Junior🔥 191 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Обработка исключений для работы с файлами

Обработка исключений при работе с файлами — критическая часть написания надёжного кода на Python. Файловые операции часто заканчиваются ошибками (файл не найден, прав доступа, диск заполнен), поэтому правильная обработка необходима.

Классический подход с try-except-finally

Традиционный способ обработки исключений при работе с файлами:

try:
    f = open("data.txt", "r")
    content = f.read()
    print(content)
except FileNotFoundError:
    print("Файл не найден")
except IOError as e:
    print(f"Ошибка чтения: {e}")
finally:
    f.close()

Здесь finally гарантирует закрытие файла даже при исключении. Но этот подход несовершенен — файл может не закрыться, если исключение возникло ещё при открытии.

Современный подход: контекстный менеджер (with)

Уже в Python 2.5 появилась конструкция with, которая автоматически управляет ресурсами:

try:
    with open("data.txt", "r") as f:
        content = f.read()
        print(content)
except FileNotFoundError:
    print("Файл не найден")
except IOError as e:
    print(f"Ошибка чтения: {e}")

При выходе из блока with (даже при исключении) файл гарантированно закроется. Это наиболее безопасный и рекомендуемый способ.

Специфичные исключения

Важно обрабатывать конкретные исключения в нужном порядке:

try:
    with open("data.txt", "r", encoding="utf-8") as f:
        lines = f.readlines()
except FileNotFoundError:
    print("Файл не существует")
except PermissionError:
    print("Нет прав доступа к файлу")
except UnicodeDecodeError:
    print("Ошибка кодировки при чтении")
except IOError as e:
    print(f"Неизвестная ошибка ввода-вывода: {e}")

Порядок важен! Более специфичные исключения должны идти перед общими.

Работа с операциями записи

try:
    with open("output.txt", "w", encoding="utf-8") as f:
        f.write("Новые данные")
        f.write("Вторая строка")
except PermissionError:
    print("Нет прав на запись")
except IOError as e:
    print(f"Ошибка записи: {e}")

Работа с несколькими файлами

При работе с несколькими файлами одновременно:

try:
    with open("input.txt", "r") as fin, open("output.txt", "w") as fout:
        for line in fin:
            fout.write(line.upper())
except FileNotFoundError as e:
    print(f"Файл не найден: {e}")
except IOError as e:
    print(f"Ошибка ввода-вывода: {e}")

Обработка исключений в pathlib

Модуль pathlib (современный подход) также работает с исключениями:

from pathlib import Path

try:
    content = Path("data.txt").read_text(encoding="utf-8")
except FileNotFoundError:
    print("Файл не найден")
except UnicodeDecodeError:
    print("Некорректная кодировка")

file_path = Path("data.txt")
if file_path.exists():
    content = file_path.read_text()
else:
    print("Файл не существует")

Создание собственного контекстного менеджера

Для специализированной обработки можно создать свой менеджер:

from contextlib import contextmanager

@contextmanager
def safe_open(filename, mode="r"):
    try:
        f = open(filename, mode)
        yield f
    except Exception as e:
        print(f"Ошибка при работе с файлом: {e}")
    finally:
        f.close()

with safe_open("data.txt", "r") as f:
    content = f.read()

Лучшие практики

  • Всегда используйте with для автоматического закрытия файлов
  • Указывайте кодировку (encoding="utf-8"), особенно при работе на Windows
  • Обрабатывайте конкретные исключения в порядке от специфичных к общим
  • Не ловите Exception без необходимости — обрабатывайте только ожидаемые ошибки
  • Логируйте ошибки для отладки и мониторинга в production
  • Валидируйте пути перед открытием файлов

Обработка исключений при работе с файлами должна быть предсказуемой, безопасной и надёжной для graceful degradation в production коде.