在MATLAB中使用try和catch语句进行调试

时间:2012-09-13 00:12:29

标签: 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()如何访问调试工作区?我必须删除所有父项中的try / catch语句才能访问调试工作区,并将'STop if errors / warnings'设置为full。

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

提前致谢。

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

Generall我同意Egon你的try / catch块根本没用。但是,对于您的调试案例,它可能不是最糟糕的主意。我建议调试这段代码:

  1. 删除重新抛出,并在发生错误时立即执行dbstop if error切换到调试模式。或者,在disp(execption.message)
  2. 的行上放置一个断点
  3. 现在你有两件事你可以做:
    • 运行脚本,当发生错误时,肯定是由无效的输入文件引起的,您可以捕获错误并实际处理它(通常会打印一条错误消息,指出名为xyz.csv的文件已被忽略)< / LI>
    • 如果你不知道错误的来源,你可以现在doSomething()函数中放置一个断点,尽可能接近错误(错误给你调用堆栈,所以你应该非常接近),然后从控制台再次手动执行doSomething()。它将在您的断点处停止,然后您可以单步执行(快捷键:F10)或进入子功能(步骤F11)。
  4. 有时在原始错误发生后会出现错误消息,然后您必须重复这些步骤。但是,一旦你进入一个函数,你就可以使用该函数的完整工作空间,从而可以手动(再次)执行所有先前的命令,以便在出现问题时回溯。