Блоки try, except и finally обеспечивают надежную обработку ошибок при работе с файлами.
try: Внутри этого блока помещается код, который может вызвать исключение (например, открытие или чтение файла).
    try:
      file = open("my_file.txt", "r")
      data = file.read()
      # ... дальнейшие операции с файлом
    except FileNotFoundError:
      print("Файл не найден.")
    except Exception as e:
      print(f"Произошла ошибка: {e}")
    finally:
      if 'file' in locals() and file:
        file.close()
        print("Файл закрыт.")
  except: Если в блоке try возникает исключение, управление передается в соответствующий блок except. Можно указать конкретный тип исключения (например, FileNotFoundError) или перехватить все исключения (Exception).
finally: Этот блок выполняется всегда, независимо от того, было ли исключение в блоке try или нет.  Используется для освобождения ресурсов, таких как закрытие файла, даже если произошла ошибка.
При работе с файлами в Python, использование блоков try, except и finally является важной практикой для обеспечения надежности и корректной обработки ошибок.  Это позволяет гарантировать, что ресурсы (в данном случае, файл) будут освобождены, даже если произошла ошибка.
Структура:
try:
    # Код, который может вызвать исключение (например, открытие и чтение файла)
    file = open("my_file.txt", "r")
    data = file.read()
    # Обработка данных из файла
    print(data)
except FileNotFoundError:
    # Обработка исключения, если файл не найден
    print("Файл не найден!")
except IOError:
    # Обработка других ошибок ввода/вывода
    print("Ошибка ввода/вывода при работе с файлом.")
except Exception as e:
    # Обработка любых других неожиданных исключений
    print(f"Произошла ошибка: {e}")
else:
    # Код, который выполняется, если в блоке try не было исключений
    print("Файл успешно прочитан и обработан.")
finally:
    # Код, который выполняется всегда, независимо от того, произошло исключение или нет
    try:
        file.close()
        print("Файл закрыт.")
    except NameError:
        # Обработка случая, когда 'file' не определена (например, файл не был открыт из-за FileNotFoundError)
        print("Файл не был открыт, закрытие не требуется.")
    except Exception as e:
        print(f"Ошибка при закрытии файла: {e}")
Пояснения:
try:  В этом блоке размещается код, который может потенциально вызвать исключение. Например, попытка открыть несуществующий файл, или чтение из поврежденного файла.except:  Этот блок (или блоки) обрабатывает исключения, возникшие в блоке try.  Можно указывать конкретные типы исключений (например, FileNotFoundError, IOError) или использовать общий Exception для обработки всех исключений. Важно обрабатывать исключения максимально конкретно, чтобы избежать маскировки других возможных ошибок.else: Этот блок выполняется только если в блоке try не возникло ни одного исключения. Он может быть полезен для кода, который должен выполняться только в случае успешного выполнения блока try.finally: Этот блок выполняется всегда, независимо от того, было ли исключение в блоке try или нет.  Он гарантирует, что код, необходимый для очистки ресурсов (например, закрытие файла), будет выполнен.  В данном случае, это критически важно для освобождения файлового дескриптора и предотвращения утечек ресурсов.finally, чтобы гарантировать, что изменения будут сохранены и ресурсы будут освобождены, даже если в блоке try возникла ошибка.  Обратите внимание на вложенный try...except в блоке finally, для обработки ситуаций, когда файл мог и не открыться вовсе.Пример использования с контекстным менеджером (with):
Более идиоматичным и рекомендуемым способом работы с файлами в Python является использование контекстного менеджера with.  Он автоматически закрывает файл после завершения блока кода, даже если произошла ошибка, что упрощает код и делает его более надежным.
try:
    with open("my_file.txt", "r") as file:
        data = file.read()
        print(data)
except FileNotFoundError:
    print("Файл не найден!")
except IOError:
    print("Ошибка ввода/вывода при работе с файлом.")
except Exception as e:
    print(f"Произошла ошибка: {e}")
else:
    print("Файл успешно прочитан и обработан.")
# Файл автоматически закрывается после выхода из блока 'with'
В этом примере, блок finally больше не требуется, так как контекстный менеджер with сам позаботится о закрытии файла.