如果它在任何时候崩溃,有没有办法为python脚本提供一个命令?

时间:2017-07-25 20:10:54

标签: python

我熟悉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()

3 个答案:

答案 0 :(得分:3)

这是上下文管理器所针对的(with语句)。 Workbook类实际上提供了必要的内容。

就像

一样简单
with xlsxwriter.Workbook('hello_world.xlsx') as workbook:
    worksheet = workbook.add_worksheet()
    [...]

请参阅Workbook documentation

如果您还想做其他事情,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()