将整个主循环包装在try..finally块中是否合理?

时间:2015-04-25 01:54:43

标签: python python-2.7 exception-handling try-finally

我在Python2.7.9为一个小项目制作了一个地图编辑器,我正在寻找方法来保存我编辑的数据,以防出现一些未处理的异常。我的编辑器已经有了一种保存数据的方法,我目前的解决方案是将主循环包装在try..finally块中,类似于这个例子:

import os, datetime #..and others.
if __name__ == '__main__':
    DataMgr = DataManager() # initializes the editor.
    save_note = None
    try:
        MainLoop()  # unsurprisingly, this calls the main loop.
    except Exception as e: # I am of the impression this will catch every type of exception.
        save_note = "Exception dump: %s : %s." % (type(e).__name__, e) # A memo appended to the comments in the save file.
    finally:
        exception_fp = DataMgr.cwd + "dump_%s.kmap" % str(datetime.datetime.now())
        DataMgr.saveFile(exception_fp, memo = save_note) # saves out to a dump file using a familiar method with a note outlining what happened.

这似乎是确保无论发生什么情况的最佳方法,在发生这种情况时,会尝试保留编辑器的当前状态(saveFile()具备此功能的程度)应该崩溃。但我想知道将我的整个主循环封装在try块中是否实际上是安全,有效和良好的形式。是吗?有风险还是有问题?是否有更好或更传统的方式?

2 个答案:

答案 0 :(得分:2)

当您需要发生某些事情时,将try...finally块中的主循环包装为可接受的模式无论。在某些情况下,它会记录和继续,在其他情况下,它会保存所有可能的东西并放弃。

所以你的代码很好。

答案 1 :(得分:1)

如果您的文件不是那么大,我建议可能将整个输入文件读入内存,关闭文件,然后对内存中的副本进行数据处理,这将解决您遇到的任何问题以可能降低运行时速度为代价来破坏数据。

或者,看看atexit python module。这允许您在程序退出时注册自动回调函数的函数。

说到你所拥有的东西应该运作得相当好。