首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MATLAB中中止程序执行?

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

Stack Overflow用户
提问于 2014-02-21 12:12:33
回答 3查看 4.8K关注 0票数 4

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

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

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

编辑:

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

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

EN

回答 3

Stack Overflow用户

发布于 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

代码语言:javascript
复制
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

示例

您可以直接从子函数返回到命令提示符,但看起来程序是通过按键终止的:

代码语言:javascript
复制
>> killTest
Operation terminated by user during killTest>annoyingFunction (line 17)

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

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

代码语言:javascript
复制
>> killTest
Fooled again! (catchable error)

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

代码语言:javascript
复制
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。我对这个解决方案的看法是:

代码语言:javascript
复制
fprintf('Terminate execution?\n<a href="matlab: dbquit;">Yes</a> / <a href="matlab: dbcont;">No</a>\n');
keyboard

当运行这段代码时,您会得到一个小提示,如下所示:

代码语言:javascript
复制
Terminate execution?
Yes / No

可以单击"Yes“和"No”文本,并执行dbquitdbcont

票数 3
EN

Stack Overflow用户

发布于 2014-02-21 12:20:54

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

尽管在两种情况下,即使是Ctrl+c也无法停止执行:

如果正在执行MEX文件,则有时会出现

  1. Ctrl+c不会有任何效果。如果内存已满,甚至无法执行Ctrl+c.

,则执行

然后,您别无选择,只能转到任务管理器并停止MATLAB进程。

票数 1
EN

Stack Overflow用户

发布于 2014-02-21 12:18:22

你的意思是

代码语言:javascript
复制
return 

您还可以使用

代码语言:javascript
复制
error("free text argument")

另外(作为调试工具)

代码语言:javascript
复制
keyboard

(但我认为这已被弃用)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21925137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档