当 Python 脚本发生异常且不处理时,程序会立即终止,打印 traceback 错误信息并返回非零退出码。 finally 块和上下文管理器( with 语句)的清理代码仍会执行,但之后的逻辑不会继续。
如果断电,整个系统会瞬间停止,正在运行的 Python 进程没有任何机会执行清理操作:
内存数据全部丢失(包括未保存的变量、缓存)
finally、 atexit 注册的函数、析构方法都不会执行
正在写入的文件可能损坏或不完整
数据库事务可能中断,导致数据不一致
# 1. 关键操作后强制刷盘
with open('data.txt', 'w') as f:
f.write("重要数据")
f.flush() # 强制写入内核缓冲区
os.fsync(f.fileno()) # 强制刷入物理磁盘
# 2. 数据库使用事务
try:
with db_connection:
db_connection.execute("UPDATE ...")
# 提交会在退出时自动执行,异常则回滚
except Exception:
logger.exception("操作失败") # 记录日志但不阻止回滚
# 3. 关键状态定期落盘
import pickle
def save_checkpoint(state):
temp = f"state.tmp.{os.getpid()}"
with open(temp, 'wb') as f:
pickle.dump(state, f)
f.flush()
os.fsync(f.fileno())
os.replace(temp, "state.pkl") # 原子替换
# 4. 使用 UPS + 看门狗
# 对关键系统,结合不间断电源和进程监控重启
核心建议:对重要数据,务必使用事务机制 + 落盘同步 + 原子写入,并考虑 UPS 硬件保护