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

如何在MATLAB中中止程序执行?,matlab,debugging,Matlab,Debugging,如何在不退出MATLAB的情况下停止MATLAB中的程序执行。我正在寻找一些类似于C++中的Exchange(1)的东西。 我尝试过退出/退出,但它们也会杀死MATLAB,这不是我想要的行为 理想情况下,我会使用try-catch冒泡出错误,但我正在修复现有代码,由于调用堆栈嵌套很深,所以无法完成这项工作。谢谢 编辑: 我还尝试了error和return,但它们最终出现在调用函数catch块中,这也不是我想要的。我只是想停止已启动的程序以退出 而且,Ctrl-C要求用户停止执行,这也不是我想要的

如何在不退出MATLAB的情况下停止MATLAB中的程序执行。我正在寻找一些类似于C++中的Exchange(1)的东西。 我尝试过退出/退出,但它们也会杀死MATLAB,这不是我想要的行为

理想情况下,我会使用try-catch冒泡出错误,但我正在修复现有代码,由于调用堆栈嵌套很深,所以无法完成这项工作。谢谢

编辑:

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

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

return 
?

你也可以使用

error("free text argument")
另外(作为调试工具)


(但我认为这是不推荐的)

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

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

  • 有时,如果要执行MEX文件
    Ctrl+c
    不会有任何效果
  • 如果RAM已满,甚至无法执行
    Ctrl+c
  • 然后,您没有其他选择,只能转到任务管理器并停止MATLAB过程

    您想要的是与CTRL-C等效的,但是通过命令而不是实际的用户按键来执行。使用Java来模拟这个按键是非常有用的。@Pursuit在其名为的函数中很好地利用了这个方法。@MattB提出了另一个基于Java的解决方案

    为了可靠地使用
    terminateExecution
    ,我发现有必要在之后立即调用一个简短的
    pause
    ,给Java时间发送按键,让MATLAB来处理它。所有嵌套的
    try
    -
    catch
    语句都将被破坏,我认为这是您需要的

    killTest.m

    功能测试
    尝试
    烦扰函数();
    fprintf('不运行');
    抓住我
    fprintf('又被愚弄了!(%s)\n',ME.message);
    结束
    结束
    函数烦扰函数()
    有什么不对=正确;%这里有更有用的代码
    如果出了什么事,
    %错误('HatteringFunction:catchableError','catchableError');
    按追踪终止执行%
    %马特B中断%。
    暂停(0.1)
    结束
    结束
    
    示例

    您可以直接从子功能返回命令提示符,但程序似乎被按键终止:

    killTest killTest>烦恼功能期间用户终止的操作(第17行) 在线测试(第4行) 烦扰函数(); >> 如果改为使用
    error
    (取消注释
    烦扰函数
    中的错误行以进行测试),它将被
    killTest
    中的
    catch
    语句捕获:

    killTest 又被愚弄了!(可捕获错误)
    建议对中断进行更改(简化、更可靠地获取命令窗口句柄和可读性):

    功能中断
    导入java.awt.event.KeyEvent
    导入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*(现在为datenum('1970','yyyy'));
    args=javaArray('java.lang.Object',1);
    args(1)=KeyEvent(cmdwin,KeyEvent.KEY_按下,msTime,。。。
    KeyEvent.CTRL\u DOWN\u掩码、KeyEvent.VK\u C、KeyEvent.CHAR\u未定义);
    方法=cmdwin.getClass().getDeclaredMethod('processKeyEvent',argSig);
    方法setAccessible(true);
    调用(cmdwin,args);
    

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

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

    “Yes”和“No”文本将可单击,并将执行
    dbquit
    dbcont

    刚刚发布,我也尝试了return和error,但它们都会出现在调用函数catch块中,这也不是我想要的。只有当用户想要打破它时,这才起作用。我想编写代码来停止执行。这种方法可以通过等待键盘输入并要求用户按ctrl-C退出程序来应用(否则我们可以通过调用exit来杀死Matlab)……但是,它仍然不理想,因为它需要用户干预。@NickKarnik True,而不是错误,你可以打印一条消息,然后暂停,等待CTRL-C。这是一个非常好的问题,但如果你不想使用异常,我认为没有解决方案。哈哈,我想要的是更像“这是一个非常简单的问题”。真奇怪。我可能不得不依赖exit,但除非我将其输出到日志文件,否则用户不会知道是什么击中了它们,但这还不是一个选项。谢谢我不太明白这个问题。你这是什么意思。你能举个例子,比如说,使用一个虚构的命令吗?当我运行一个应用程序时,它遇到了一个无法正常处理的致命错误…我想停止运行该程序,这样我就不会损坏计算数据,并允许用户进行必要的更正,然后重新启动运行,以便我们可以继续它停止的地方(本质上是kill/halt/stop/terminate/exit)。如果您知道可能发生错误的行,那么我认为您可以执行以下操作:1.保存所有工作区2.当错误发生时,保留您正在运行的语句/函数的记录,我认为这是可以执行的(到目前为止,我不知道如何执行)3.从数据库加载数据时运行该函数
    fprintf('Terminate execution?\n<a href="matlab: dbquit;">Yes</a> / <a href="matlab: dbcont;">No</a>\n');
    keyboard
    
    Terminate execution?
    Yes / No