2

我在调用一堆嵌套函数的 MATLAB 文件中有一个 try/catch 语句。简单地说,try/catch 运行在“顶级”级别,迭代一个我调用函数的文件列表。

for i=1:length(FILELIST)
try
dosomething(FILELIST(i)
catch
disp(exception.message)
rethrow(exception)
end

我的问题是,说 dosomething() 有很多子函数 dosomethingchild() 我怎样才能访问它的调试工作区?我必须删除所有父项中的 try/catch 语句才能访问调试工作区,并将“如果错误/警告设置为完整则停止”。

try/catch 使调试变得更加困难,但我想保留它,因为有时代码会因为文件的性质而在某些文件上失败……而不是代码本身。

提前致谢。

4

3 回答 3

4

只需删除它try..catch。由于您只是显示和重新抛出错误,而没有实际捕获任何特定内容,因此对于文件性质引起的错误具有鲁棒性是不可行的生产代码。它将与没有 的行为相同try..catch,因此在出现错误后它将停止执行。

stop if error启用后,它将在您的错误处理程序中停止,正如您已经注意到的那样,这是无用的。从那里不可能返回到被调用函数的工作区,因为这些工作区已经关闭(调用已经返回)。

在现实生活中,您也可以尝试dbstop if caught error与 your 一起尝试try..catch,但在这种情况下,我建议要么摆脱 要么try..catch至少让它捕获特定错误。您可能还想在(特定)错误发生时立即捕获它们;离实际发生的越远,特定错误通常产生的意义就越小。

于 2012-09-13T05:39:55.820 回答
1

为什么不添加 keyboard到您的 catch 语句并检查代码失败时发生的情况。

于 2012-09-13T00:25:26.377 回答
0

一般来说,我同意Egon的观点,即您的 try/catch 块根本没有帮助。但是,对于您的调试情况,这可能不是最糟糕的主意。我对调试此代码的建议:

  1. 去掉rethrow,dbstop if error一旦出现错误就执行切换到debug模式。或者,在带有disp(execption.message).
  2. 现在你有两件事可以做:
    • 运行脚本,当发生肯定是由无效输入文件引起的错误时,您可以捕获错误并实际处理它(通常打印一条错误消息,指出名称为 xyz.csv 的文件已被忽略)
    • 如果您不知道错误的来源,您现在可以在函数中放置一个断点doSomething(),最好尽可能靠近错误(错误为您提供调用堆栈,因此您应该非常接近),然后doSomething()再次手动执行从控制台。它将在您的断点处停止,然后您可以单步执行(快捷方式:F10)或单步执行您的子功能(单步执行,F11)。
  3. 有时错误消息是在原始错误发生之后出现的,那么您将不得不重复这些步骤。然而,一旦你在一个函数中,你就有了该函数的完整工作空间,因此可以手动(再次)执行所有先前的命令,以回溯出错的地方。
于 2016-07-06T09:21:38.977 回答