3

我已经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块中是否实际上是安全、高效和良好的形式。是吗?是否存在风险或问题?有没有更好或更传统的方法?

4

2 回答 2

2

当您无论如何try...finally都需要发生某些事情时,将主循环包装在一个块中是公认的模式。在某些情况下,它会记录并继续,在其他情况下,它会保存所有可能的内容并退出。

所以你的代码很好。

于 2015-04-25T02:19:29.707 回答
1

如果您的文件不是那么大,我建议您可能将整个输入文件读入内存,关闭文件,然后对内存中的副本进行数据处理,这将解决您在不损坏数据时遇到的任何问题可能减慢运行时间的成本。

或者,看看atexit python 模块。这允许您在程序退出时为自动回调函数注册一个函数。

话虽如此,您所拥有的应该可以很好地工作。

于 2015-04-25T02:18:43.577 回答