如何在不退出MATLAB的情况下在MATLAB中停止程序执行。我在C ++中寻找类似exit(1)的东西。
我已尝试退出/退出,但他们也杀了MATLAB,这不是我想要的行为。
理想情况下,我会使用try-catch来冒泡错误,但我修复了现有的代码,而且由于深度嵌套的调用堆栈而无法做到这一点。谢谢!
编辑:
我还尝试了error
和return
,但最终却出现在调用函数catch块中,这也不是我想要的。我只想停止已启动的程序退出。
此外,Ctrl-C要求用户停止执行,而这也不是我想要的。
答案 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
“是”和“否”文字将是可点击的,可以执行dbquit
或dbcont
。
答案 1 :(得分:1)
您正在寻找Ctrl+c
组合键。这将中止任何程序的执行。将光标移至MATLAB的命令窗口,然后按Ctrl+c
。
虽然偶然Ctrl+c
无法停止执行有两种情况:
Ctrl+c
不会有任何影响。Ctrl+c
。然后您没有其他选择,只能转到任务管理器并停止MATLAB过程。
答案 2 :(得分:0)
你的意思是
return
您也可以使用
error("free text argument")
也(作为调试工具)
keyboard
(但我认为已弃用)