假设我要编写一个 Python 脚本来捕获KeyboardInterrupt
异常,以便用户使用Ctrl+C安全地终止
但是,我不能将所有关键操作(如文件写入)放入catch
块中,因为它依赖于局部变量并确保后续Ctrl+C无论如何都不会破坏它。
使用带有空 ( pass
)try
部分的 try-catch 块和该部分内的所有代码finally
将此片段定义为可能不会在中途中断的“原子、中断安全代码”是否可行并且是一种好习惯?
例子:
try:
with open("file.txt", "w") as f:
for i in range(1000000):
# imagine something useful that takes very long instead
data = str(data ** (data ** data))
try:
pass
finally:
# ensure that this code is not interrupted to prevent file corruption:
f.write(data)
except KeyboardInterrupt:
print("User aborted, data created so far saved in file.txt")
exit(0)
在此示例中,我不关心当前生成的数据字符串,即创建可能会中断并且不会触发写入。但是一旦开始写入,就必须完成,这就是我要确保的全部。此外,如果在 finally 子句中执行写入时发生异常(或 KeyboardInterrupt)会发生什么?