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

如果python脚本在任何时候崩溃,有没有办法为它提供一个命令?,python,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() 嗯

我对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()

嗯。一般来说,这可以通过以下方式解决:

try:
     code that produces error
finally:
     cleanup()

对于调用
close
方法的特定情况(对象本机不支持上下文管理协议,因此不能在
with
语句中直接使用它),您可以对
进行一些改进,最后尝试将其包装成
语句兼容,替换您的代码:

ws = wb.add_worksheet()
for i in range (len(list)):
    ws.write(i,0,"Hello World!")
使用(将
import contextlib
添加到文件顶部):

当块退出时,无条件地调用
close
,无论是异常情况下,
return
,还是只是自然无误地离开块或
return
ing(这通常是您想要的)。如果出于某种原因,您只想在出现异常时调用它,则可以执行以下操作:

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

这将仅在异常发生时关闭,并将重新引发异常(因为在此场景中以静默方式继续可能是错误的)。

这就是上下文管理器的作用(带
语句的
)。工作簿类实际上提供了所需的内容

这很简单

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



如果您还想做其他事情,
尝试。。。除了其他的最后,您需要的是
语句。请参见

正如Joonatan Samuel在其回答中所建议的,您可能希望运行ws.close(),而不管成功与否(这是最终将给您的结果)。如果您希望它只在失败时运行,请使用except。这是一个伟大而简单的解决方案!我喜欢contextlib的强大功能,这可能适用于多种方法
with xlsxwriter.Workbook('hello_world.xlsx') as workbook:
    worksheet = workbook.add_worksheet()
    [...]