Debugging MATLAB中try-and-catch语句的调试

Debugging MATLAB中try-and-catch语句的调试,debugging,matlab,editor,Debugging,Matlab,Editor,我在MATLAB文件中有一个try/catch语句,它调用了一系列嵌套函数。简单地说,try/catch是在“top”级别运行的,它对我调用函数的文件列表进行迭代 for i=1:length(FILELIST) try dosomething(FILELIST(i) catch disp(exception.message) rethrow(exception) end 我的问题是,假设dosomething()有许多子函数dosomethingchild(),我如何访问它的调试工作区?我必

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

for i=1:length(FILELIST)
try
dosomething(FILELIST(i)
catch
disp(exception.message)
rethrow(exception)
end
我的问题是,假设dosomething()有许多子函数dosomethingchild(),我如何访问它的调试工作区?我必须删除所有父级中的try/catch语句,以便在“错误/警告时停止”设置为full时访问调试工作区

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


提前感谢。

为什么不将
键盘添加到catch语句中,并检查代码失败时的情况。

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

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

在现实生活中,如果捕捉到错误,您也可以尝试使用
dbstop
try..catch
,但在这种情况下,我建议您要么去掉
try..catch
,要么至少让它捕捉特定的错误。您可能还希望在(特定)错误发生时立即捕获它们;与实际发生的距离越远,特定错误通常产生的意义就越小。

概述我同意您的try/catch块根本没有帮助。然而,对于您的调试案例来说,这可能不是最糟糕的想法。我对调试此代码的建议:

  • 移除重试,并在出现错误时执行
    dbstop if error
    ,以切换到调试模式。或者,在带有
    disp(execption.message)
    的行上放置一个断点
  • 现在您可以做两件事:
    • 运行该脚本,当发生由无效输入文件引起的错误时,您可以捕获错误并实际处理它(通常打印一条错误消息,说明名称为xyz.csv的文件已被忽略)
    • 如果您不知道错误的来源,现在可以在
      doSomething()
      函数中放置一个断点,尽可能靠近错误(错误提供了调用堆栈,因此您应该非常接近),然后再次从控制台手动执行
      doSomething()
      。它将在断点处停止,然后您可以单步执行(快捷方式:F10)或单步执行子函数(单步执行,F11)
  • 有时,错误消息发生在原始错误发生之后,您必须重复这些步骤。然而,一旦你在一个函数中,你就有了该函数的完整工作空间,因此你可以手动(再次)执行之前的所有命令,来回溯哪里出了问题

  • 如果要在发布的代码中保留try/catch,这可能会导致问题。