是否可以将整个代码包装成"尝试...除了"作为最后的手段?

时间:2016-12-26 10:59:43

标签: python python-3.x

说,我有一个很大的应用程序在python上运行在服务器上每天几次,有时它会崩溃。我想,当它崩溃时,它至少会释放所有资源,如数据库连接,文件处理程序等。

我有一些"尝试......除了"在其中阻挡,但是谁知道它接下来会在哪里崩溃?它可能会在某些代码未被包装的地方崩溃"尝试...除了"。

推荐的改进方法是什么?我应该将整个脚本体包装到"尝试...除了"作为最后的手段?或者是什么?

2 个答案:

答案 0 :(得分:4)

AFAICT CPython解释器实际上应该在未处理的异常上自行释放大多数资源(并发出带有完整回溯的错误消息) - 除了可能因编写错误的扩展代码(与Python接口的二进制代码)无法正确释放资源垃圾收集。

话虽如此,大多数表现良好的Python应用确实都有一个“顶级”的全能异常处理程序,负责清理可能的内容(全局数据库连接等),最重要的是,确保并在某处记录完整的追溯并通知维护者。

wrt /正确发布本地分配的资源(文件等),上下文管理器是你的朋友,即使用

with open(...) as myfile: 
    code_that_may_crash(...) 

正如其他人已经提到的那样,修复根问题是更好的解决方案,但有时你却不能,因为它超出你的代码(网络故障,磁盘已满或突然出现,无论如何......)

总结一下:

  1. wrt / resources deallocation,您最好的选择是尽可能使用上下文管理器,让CPython运行时负责其余的

  2. 没有(并且可能是一个好主意)拥有一个顶级的catch-all异常处理程序,但它应该主要关注错误报告,最好再加上异常。

答案 1 :(得分:2)

使用try-catch包装整个代码是最简单的方法,但它并没有解决问题。

我认为最好的方法是找出崩溃的根本原因并处理它,即使只是打印错误消息并退出。