说,我有一个很大的应用程序在python上运行在服务器上每天几次,有时它会崩溃。我想,当它崩溃时,它至少会释放所有资源,如数据库连接,文件处理程序等。
我有一些"尝试......除了"在其中阻挡,但是谁知道它接下来会在哪里崩溃?它可能会在某些代码未被包装的地方崩溃"尝试...除了"。
推荐的改进方法是什么?我应该将整个脚本体包装到"尝试...除了"作为最后的手段?或者是什么?
答案 0 :(得分:4)
AFAICT CPython解释器实际上应该在未处理的异常上自行释放大多数资源(并发出带有完整回溯的错误消息) - 除了可能因编写错误的扩展代码(与Python接口的二进制代码)无法正确释放资源垃圾收集。
话虽如此,大多数表现良好的Python应用确实都有一个“顶级”的全能异常处理程序,负责清理可能的内容(全局数据库连接等),最重要的是,确保并在某处记录完整的追溯并通知维护者。
wrt /正确发布本地分配的资源(文件等),上下文管理器是你的朋友,即使用
with open(...) as myfile:
code_that_may_crash(...)
正如其他人已经提到的那样,修复根问题是更好的解决方案,但有时你却不能,因为它超出你的代码(网络故障,磁盘已满或突然出现,无论如何......)
总结一下:
wrt / resources deallocation,您最好的选择是尽可能使用上下文管理器,让CPython运行时负责其余的
没有(并且可能是一个好主意)拥有一个顶级的catch-all异常处理程序,但它应该主要关注错误报告,最好再加上异常。
答案 1 :(得分:2)
使用try-catch包装整个代码是最简单的方法,但它并没有解决问题。
我认为最好的方法是找出崩溃的根本原因并处理它,即使只是打印错误消息并退出。