1

我想知道在命令窗口中输入几行或让脚本执行它们之间有什么区别。

在问题Escape from nested try - catch statement 中,我有一个示例函数。我已将所选代码放入脚本并调用它,但是它无法正常工作。另一方面,当我 选择行并点击 f9时,它按预期工作。

这些行是:

dbclear all
dbquit
dbstop if caught error

我这样调用示例函数:

dbstop if caught error
mytestmain

示例函数是:

function mytestmain 
try
    mytestsub
catch
end

% Definition of subfunction, may or may not be in the same .m file
function mytestsub
try
    a=b; %Intentionally generate an error as b is not defined
catch
end
4

2 回答 2

3

我认为这与 MATLAB 的即时 (JIT) 编译器有关,它会在运行函数之前对其进行编译。

dbstop如果设置与否,它似乎以不同的方式编译函数(参见此处以供参考)。就目前而言,MATLAB 无法在运行时重新编译函数(只需尝试在 a 期间保存更改的函数dbstop,您将收到一条消息通知您)。因为您可以在 a 期间添加和删除断点,dbstop我认为您也可以通过编程方式执行此操作,但如果在“编译时”未打开调试,则应该不可能“打开”调试

所以在你的情况下:

  • 使用F9它只是粘贴和解析,就像您手动输入一样。所以首先dbstop设置,然后mytestmain编译并执行。
  • 作为脚本运行将首先编译脚本,mytestmain然后执行它 - 因此dbstop将在编译后设置,因此无效。
于 2013-06-05T13:26:03.100 回答
0

根据您所说的“不起作用”的含义,这可能只是因为调试器是一个特殊的上下文,并且某些调试器命令 - dbupdbdowndbquit- 仅在您处于调试器“K>>”提示符时才起作用。一旦你调用了一个脚本,你就不再是在调试器提示符下,而是在正常的代码执行中——在嵌套的 M 代码调用堆栈中——它们只是在那里不起作用。当您按 F9 时,它会单独执行这些行,因此每一行都是根据提示完成的。

作为一种解决方法,如果您真的想执行这样的调试器命令序列,您可以编写一个小的 Java Swing 小部件来将文本输入到命令窗口,就像您正在输入它一样。

于 2013-06-08T04:34:15.523 回答