在脚本中止运行清理代码

时间:2014-03-04 17:04:24

标签: matlab

我确信以前曾经问过这个问题但是我找不到它。

我想要做的是在脚本运行时中止(CTRL + C)脚本时运行一些代码,例如,如果我打开一个文件我想要关闭命令来运行,即使我中止或者那里错误。

像try一样最终在其他语言中,只有在中止时没有错误,所以try \ catch在这里不起作用。

感谢。

2 个答案:

答案 0 :(得分:3)

请查看onCleanup,其目的仅限于此目的。

onCleanup创建一个对象,当它超出范围(因此被删除)时,执行一些代码。所以,例如,

c1 = onCleanup(@() disp('goodbye'))

创建一个对象c1。当c1超出范围时,会将其删除,并显示goodbye。类似地

c2 = onCleanup(@() fclose(fid))

创建一个对象,删除后会关闭ID为fid的文件。

您需要对代码样式进行更改才能利用onCleanup - 具体而言,您需要将内容实现为函数而不是脚本。脚本使用基础工作区,因此在完成时,您创建的任何清理对象都将保留在基础工作区中,而不会超出范围并被删除,因此它们的代码永远不会执行。

相比之下,函数有自己的工作区,完成后会被清除,自动删除任何清理对象。重要的是,对于您的问题,此工作空间不仅在函数正常完成时清除,而且如果它以错误结束,即使它以 Ctrl C 结束,也会被清除。 / p>

将脚本修改为函数通常很简单:如果脚本被调用mytest.m,只需将function mytest放在脚本的顶部即可。在某些情况下,这将无法工作(例如,如果您的脚本依赖于基础工作区中可用的其他变量),但这些情况无论如何都不是一个好主意。

例如,运行以下程序:

function mytest

c = onCleanup(@() disp('goodbye'));

for i = 1:1000000
    disp(i)
end

执行期间,按 Ctrl C 。您应该看到在最后一个号码后显示goodbye

答案 1 :(得分:0)

您无法自定义CTRL-C快捷方式。

请参阅matlab文档中的Actions for Which You Cannot Customize Keyboard Shortcuts