如何在MATLAB中中止程序执行?

时间:2014-02-21 04:12:33

标签: matlab debugging

如何在不退出MATLAB的情况下在MATLAB中停止程序执行。我在C ++中寻找类似exit(1)的东西。

我已尝试退出/退出,但他们也杀了MATLAB,这不是我想要的行为。

理想情况下,我会使用try-catch来冒泡错误,但我修复了现有的代码,而且由于深度嵌套的调用堆栈而无法做到这一点。谢谢!

编辑:

我还尝试了errorreturn,但最终却出现在调用函数catch块中,这也不是我想要的。我只想停止已启动的程序退出。

此外,Ctrl-C要求用户停止执行,而这也不是我想要的。

3 个答案:

答案 0 :(得分:3)

你想要的是CTRL-C的等效,但要通过命令执行而不是按实际用户键。使用Java Robot模拟此按键是suggested by @yuk。 @Pursuit在他的函数terminateExecution中很好地利用了这种方法。另一个基于Java的解决方案interrupt由@MattB提出。

为了有力地使用terminateExecution,我发现有必要立即调用一个简短的pause,以便给Java时间发送按键以及MATLAB来处理它。所有嵌套的try - catch语句都会被打破,因为我认为你需要。

<强> killTest.m

function killTest

try
    annoyingFunction();
    fprintf('Does not run.');
catch ME
    fprintf('Fooled again! (%s)\n',ME.message);
end

end

function annoyingFunction()

somethingWrong = true; % more useful code here
if somethingWrong,
    % error('annoyingFunction:catchableError','catchable error');
    terminateExecution % by Pursuit
    % interrupt % by Matt B.
    pause(0.1)
end

end

示例

您直接从子功能返回命令提示符,但看起来该程序已被按键终止:

>> killTest
Operation terminated by user during killTest>annoyingFunction (line 17)

In killTest (line 4)
    annoyingFunction();
>>

如果您改为使用error(取消注释annoyingFunction中的错误行进行测试),它会被catch中的killTest语句捕获:

>> killTest
Fooled again! (catchable error)

interrupt的建议更改(简化,更可靠地获取命令窗口句柄和可读性):

function interrupt

import java.awt.event.KeyEvent
import java.lang.reflection.*

base = com.mathworks.mde.cmdwin.CmdWin.getInstance();
hCmd = base.getComponent(0).getViewport().getView();
cmdwin = handle(hCmd,'CallbackProperties');

argSig = javaArray('java.lang.Class',1);
argSig(1) = java.lang.Class.forName('java.awt.event.KeyEvent');

msTime = (8.64e7 * (now - datenum('1970', 'yyyy')));
args = javaArray('java.lang.Object',1);
args(1) = KeyEvent(cmdwin,KeyEvent.KEY_PRESSED,msTime,...
    KeyEvent.CTRL_DOWN_MASK,KeyEvent.VK_C,KeyEvent.CHAR_UNDEFINED);

method = cmdwin.getClass().getDeclaredMethod('processKeyEvent',argSig);
method.setAccessible(true);
method.invoke(cmdwin,args);

注意:如果您可以输入完全退出的内容,只需使用keyboard,当它在调试提示符处停止时(K>>)键入dbquit,您将返回基础工作区命令提示符。 MATLAB Central newsreader提供了一种可爱的方式来提供可执行dbquit的可点击触发器。我的解决方案版本:

fprintf('Terminate execution?\n<a href="matlab: dbquit;">Yes</a> / <a href="matlab: dbcont;">No</a>\n');
keyboard

当运行这段代码时,你得到一个像这样的小提示:

Terminate execution?
Yes / No

“是”和“否”文字将是可点击的,可以执行dbquitdbcont

答案 1 :(得分:1)

您正在寻找Ctrl+c组合键。这将中止任何程序的执行。将光标移至MATLAB的命令窗口,然后按Ctrl+c

虽然偶然Ctrl+c无法停止执行有两种情况:

  1. 有时,如果正在执行MEX文件。 Ctrl+c不会有任何影响。
  2. 如果您的RAM太满,甚至无法执行Ctrl+c
  3. 然后您没有其他选择,只能转到任务管理器并停止MATLAB过程。

答案 2 :(得分:0)

你的意思是

return 

您也可以使用

error("free text argument")

也(作为调试工具)

keyboard

(但我认为已弃用)