逃离嵌套的 try-catch 语句

5

我目前正在调试嵌套的try-catch语句代码。

我可以使用dbstop命令轻松处理错误,但每次查看代码并想要停止程序运行时,我都必须为每个嵌套级别输入一次dbquit

由于这非常烦人,我正在寻找一种解决方案,以便在完成调试后真正停止调试所有程序。

以下是我调用代码的示例:

dbstop if error
dbstop if caught error
mytestmain

以下是一个函数示例,其中子函数可以在不同的 .m 文件中:

function mytestmain 
try
    mytestsub
catch
end

%% Definition of subfunction
function mytestsub
try
    a=b;%generate an error as b is not defined
catch
end

我尝试了什么?

  • 我尝试使用一个调用dbquit两次的脚本或函数,但这只会执行一次dbquit
  • 我尝试使用dbquit('all'),但没有效果。

请注意,我不希望在代码中删除try-catch语句。


这种行为令人惊讶;无论您的try/catch嵌套有多深,dbquit都应该让您完全退出调试器和代码执行。我经常在深度嵌套的try/catch中使用它。您正在运行哪个版本的Matlab? - Andrew Janke
2个回答

2

在使用 dbquit 之前,您可以调用 dbclear

dbclear all; dbquit;

请注意,这将清除您手动设置的所有断点,因此,如果您还使用其他断点,请使用更好的方法。但请注意,这将清除您手动设置的所有断点,因此,如果您还使用其他断点,则应该使用


dbclear if error; dbclear if caught error; dbquit;

1
除非你也使用断点,否则这可能会更烦人...另外,你必须一遍又一遍地重新输入“dbstop if caught error; dbstop if error”。 - Rody Oldenhuis
@RodyOldenhuis 是的,你是对的;感谢你提醒我。请查看我的更新答案。 - H.Muster
实际上,我会通过设置两个快捷方式来解决这个问题。第一个快捷方式是 dbclear if error; dbclear if caught error; dbquit;,第二个快捷方式是 dbstop if caught error;dbstop if error; 这样只需要两次点击即可。 - H.Muster
我想我会选择两步解决方案,尽管我仍然不明白为什么不能将这些步骤合并为1步。 - Dennis Jaheruddin
可能是同样的原因,为什么在while循环中dbquit不起作用,这对我来说也是个谜。 - H.Muster
让我们看看能否找到答案:http://stackoverflow.com/questions/16940495/difference-between-script-and-matlab-command-window - Dennis Jaheruddin

1
这不是它应该工作的方式。一个单独的dbquit应该可以完全退出调试器,无论您的try/catch语句嵌套有多深以及仍设置了哪些断点。

您是否在运行旧版本的Matlab?在Matlab R2009b之前的版本中存在dbstop if caught error相关的已知错误,听起来可能会导致这种行为。如果您使用的是旧版本,则可以升级。
无论您使用的是哪个版本,请尝试执行dbstop if all error而不是单独的dbstop if errordbstop if caught error语句,并查看行为是否发生变化。
我还猜想您可能正在从“K>>”提示符内运行多个函数,并最终出现嵌套的调试器会话,但您执行的dbquit('all')应该处理了该情况。

我使用的版本相当新,我不认为那是问题所在。我的猜测也是类似于嵌套会话之类的东西,或者我首先捕获一个错误(通过dbstop if caught error捕获),然后实际上通过使用dbquit创建一个错误,这将触发dbstop if error条件。我有机会时会尝试您的解决方案。 - Dennis Jaheruddin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接