如果不是所有必须对文件执行的操作都成功(即,如果引发异常),我需要删除该文件。它可以简单到使用except:,删除文件,然后重新引发异常,但在这种情况下,如果由于任何神秘原因无法在except子句中删除文件,则原始异常将丢失。
我能想到的最好的办法是:
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
有谁知道一种更好,更像蟒蛇的方法吗?
最佳答案
另一种选择是,如果不想丢失异常,只需存储它:
Python 3.x版本:
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版本稍微复杂一些,因为您需要手动存储完整的异常信息(否则将丢失回溯):
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]
编辑:只在内部
Exception
块中捕获try
的子类,因为您不希望在此处执行do catchSystemExit
或KeyboardInterrupt
。还要报告在取消链接期间发生的任何异常情况,而不是仅仅删除它。