Python KeyboardInterrupt 导致文件损坏

问题描述

我有一段代码负责清理 XML 文件。处理解析错误(忽略文件)。

然而,我用 ctrl+C 中断了这个函数,它最终破坏了当前处理的文件文件内容删除):

import lxml.etree as ET
from pathlib import Path


def foo(path: str):
  try:
    tree = ET.parse(path)
    # Some code that reads and modifies the tree...
  except ET.ParseError:
    return
  Path(path).write_text(ET.tostring(tree))

有没有办法在 KeyboardInterrupt 上执行清理代码

例如,我应该在一个 except 块中处理 KeyboardInterrupt 以避免写入吗?也许我可以在错误处理后使用 else 块只在没有发生错误时写入:

def foo(path: str):
  try:
    tree = ET.parse(path)
    # Some code that reads and modifies the tree...
  except ET.ParseError:
    return
  else:
    Path(path).write_text(ET.tostring(tree))

解决方法

解决方案是在写入文件时检查 KeyboardInterrupt 并在退出前重新尝试写入操作:

import lxml.etree as ET
from pathlib import Path
from sys import exit

def foo(path: str):
  try:
    tree = ET.parse(path)
    # Some code that reads and modifies the tree...
  except ET.ParseError:
    return
  else:
    content = ET.tostring(tree)
    try:
      Path(path).write_text(content)
    except KeyboardInterrupt:
      Path(path).write_text(content)
      exit()

将该代码放在 else 子句中可确保之前的操作不会失败,因此此时数据是有效的。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...