我确信以前曾经问过这个问题但是我找不到它。
我想要做的是在脚本运行时中止(CTRL + C)脚本时运行一些代码,例如,如果我打开一个文件我想要关闭命令来运行,即使我中止或者那里错误。
像try一样最终在其他语言中,只有在中止时没有错误,所以try \ catch在这里不起作用。
感谢。
答案 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。