使用条件异常处理(即重新抛出)调试回原始错误

时间:2012-05-03 10:08:09

标签: debugging matlab error-handling

在Matlab中,据我所知,有条件地捕获异常没有好办法(如果我错了,请纠正我)。唯一的方法是捕获异常,检查标识符,并在无法处理此特定错误时重新抛出错误。虽然不方便,但这是可以接受的。但是,当我使用Matlabs dbstop if error时,我最终会在ME.rethrow()行。然后,我无法dbup返回到导致原始错误的地方。

function test_excc

try
    sub_test()
catch ME
    if strcmp(ME.identifier, 'test:notsobad')
        fprintf(1, 'Fine\n');
    else
        ME.rethrow();
    end
end

end

function sub_test
sub_sub_test();
end

function sub_sub_test()
if rand>0.5
    error('test:error', 'Noooo!');
else
    error('test:notsobad', 'That''OK');
end
end

使用示例:

>> test_excc()
Error using test_excc>sub_sub_test (line 21)
Noooo!

Error in test_excc>sub_test (line 16)
sub_sub_test();

Error in test_excc (line 4)
    sub_test()

9           ME.rethrow();
K>> dbstack
> In test_excc at 9

虽然Matlab桌面环境将整个堆栈跟踪打印回sub_sub_test,但是调试器不能让我在该函数内部进行堆栈跟踪和调试。

我知道dbstop if caught error。但是,这将调试到任何捕获的错误,如果软件大量使用异常,这可能会很多。我只想停止未捕获的错误,但我想停止生成错误的位置 - 而不是重新生成的位置。

我的问题:

  • 在Matlab中,我如何有条件地捕获错误(基于错误标识符)并调试到最初抛出错误的位置?

1 个答案:

答案 0 :(得分:3)

我猜你不能这样做。一旦执行进入catch语句,dbstack将必须引用catch中的该位置,因此调试错误原因所需的信息将丢失。 ME.stack会告诉您异常的来源,但这并不足以在该位置进行调试。

所以我怀疑你可以通过在捕获内部做一些聪明的事来解决问题。查看catch的文档,似乎也不是一种java风格catch (ExceptionType ME)的方法。

通过编程方式使用调试命令,可能有一些hacky方法可以解决这个问题。例如,S = dbstatus保存调试状态,如果有从存储状态恢复的方法,则可以将此附加到异常。但我无法找到任何记录的方法来做到这一点。