我熟悉try,除了。但是我正在寻找一种更通用的方法,它只是在脚本在引发任何错误后停止运行之前运行一个简单的命令。
例如,如果我使用的是xlsxwriter:
import xlsxwriter
wb = xlssxwriter.Workbook
ws = wb.add_worksheet()
for i in range (len(list)):
ws.write(i,0,"Hello World!")
#If this script fails, run ws.close()
答案 0 :(得分:3)
这是上下文管理器所针对的(with
语句)。 Workbook类实际上提供了必要的内容。
就像
一样简单with xlsxwriter.Workbook('hello_world.xlsx') as workbook:
worksheet = workbook.add_worksheet()
[...]
如果您还想做其他事情,try ... except ... else ... finally
语句就是您所需要的。见documentation
答案 1 :(得分:2)
对于调用close
方法的特定情况(对象本身不支持上下文管理协议,因此您无法在with
语句中使用它),您可以通过using contextlib.closing
改善try
/ finally
以使其包裹,使其with
语句兼容,替换您的代码:
ws = wb.add_worksheet()
for i in range (len(list)):
ws.write(i,0,"Hello World!")
with(将import contextlib
添加到文件顶部):
with contextlib.closing(wb.add_worksheet()) as ws:
for i in range(len(list)):
ws.write(i,0,"Hello World!")
在退出块时无条件地调用close
,无论是异常,return
,还是只是自然地离开块而没有错误或return
(通常是你想要的) 。如果由于某种原因你只想在遇到异常时调用它,你可以这样做:
ws = wb.add_worksheet()
try:
for i in range (len(list)):
ws.write(i,0,"Hello World!")
except: # Okay to use bare except because we re-raise after cleanup
ws.close()
raise # Re-raise whatever exception led us here now that cleanup is done
发生异常时只会close
,并且会重新加载异常(因为在这种情况下可能会出现静默)。
答案 2 :(得分:0)
好。一般来说,这可以通过以下方式解决:
try:
code that produces error
finally:
cleanup()