首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只有在引发异常时才清除对象

问只有在引发异常时才清除对象
EN

Stack Overflow用户
提问于 2011-10-07 12:08:46
回答 1查看 307关注 0票数 3

如果不是必须对其执行的所有操作都成功(即,如果引发异常),则需要删除一个文件。它本来可以简单地使用除了:,删除文件,然后重新引发异常,但在这种情况下,原始异常将丢失,如果文件不能删除的除外子句中的任何神秘的原因。

我想出的最好办法是:

代码语言:javascript
复制
try:
    file_path = "whatever.jpg"
    # do stuff with file
except:
    exception_raised = True
    raise
finally:
    try:
        if exception_raised:
            os.unlink(file_path)
    except:
        pass

return file_path   # everything OK

有没有人知道一种更好的,更毕达通的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-07 12:26:49

另一种选择是,如果您不想丢失异常,只需存储它:

Python3.x版本:

代码语言:javascript
复制
try:
    file_path = "whatever.jpg"
    # do stuff with file
except BaseException as e:
    try:
        os.unlink(file_path)
    except Exception:
        traceback.print_exc()
    raise e

Python2.x版本稍微复杂一些,因为您需要手动存储完整的异常信息(否则会丢失跟踪):

代码语言:javascript
复制
try:
    file_path = "whatever.jpg"
    # do stuff with file
except:
    e = sys.exc_info()
    try:
        os.unlink(file_path)
    except Exception:
        traceback.print_exc()
    raise e[0], e[1], e[2]

编辑:只在内部try块中捕获Exception的子类,因为您不希望在这里捕获SystemExit或KeyboardInterrupt。另外,报告在断开链接期间发生的任何额外情况,而不仅仅是删除它。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7687012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档