如何在不退出MATLAB的情况下停止MATLAB中的程序执行。我在C++中寻找类似于exit(1)的东西。
我尝试过退出/退出,但他们也杀死了MATLAB,这不是我想要的行为。
理想情况下,我会使用try-catch来冒泡错误,但我正在修复现有代码,并且由于深度嵌套的调用堆栈而无法做到这一点。谢谢!
编辑:
我也尝试过error和return,但它们最终出现在调用函数的catch块中,这也不是我想要的。我只是想停止启动的程序退出。
另外,Ctrl-C要求用户停止执行,这也不是我想要的。
发布于 2014-02-21 17:44:35
你想要的是等效于CTRL-C,但是要通过命令而不是实际的用户按键来执行。suggested by @yuk就是用Java语言的Robot来模拟这个按键。@Pursuit在他的terminateExecution函数中很好地利用了这种方法。另一个基于Java的解决方案interrupt是由@MattB提出的。
要健壮地使用terminateExecution,我发现有必要在之后立即调用一个简短的pause,以便让Java有时间发送按键,并让MATLAB处理它。所有嵌套的try-catch语句都将被破坏,正如我认为您需要的那样。
killTest.m test.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中的错误行以进行测试),它将被killTest中的catch语句捕获
>> 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可以单击"Yes“和"No”文本,并执行dbquit或dbcont。
发布于 2014-02-21 12:20:54
您正在寻找Ctrl+c键组合。这将中止任何程序的执行。将光标移至MATLAB的命令窗口,然后按Ctrl+c键。
尽管在两种情况下,即使是Ctrl+c也无法停止执行:
如果正在执行MEX文件,则有时会出现
Ctrl+c不会有任何效果。如果内存已满,甚至无法执行Ctrl+c.,则执行
然后,您别无选择,只能转到任务管理器并停止MATLAB进程。
发布于 2014-02-21 12:18:22
你的意思是
return 您还可以使用
error("free text argument")另外(作为调试工具)
keyboard(但我认为这已被弃用)
https://stackoverflow.com/questions/21925137
复制相似问题