4

据我所知,在 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 中,如何有条件地捕获错误(基于错误标识符)并调试到最初引发错误的地方?
4

1 回答 1

3

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

所以我怀疑你可以通过在 catch 中做一些聪明的事情来解决这个问题。查看 catch 的文档,似乎也没有办法执行 java-style catch (ExceptionType ME)

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

于 2012-05-03T11:14:35.297 回答