gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:02:57 24 4
gpt4 key购买 nike

在 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。但是,这将调试到任何 捕获的错误,如果软件大量使用异常,则可能会出现很多错误。我只想在 Uncaught Error 处停止,但我想在产生错误的地方停止,而不是在重新抛出错误的地方停止。

我的问题:

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

最佳答案

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

所以我怀疑你能否通过在 catch 中做一些巧妙的事情来解决问题。查看 catch 的文档,似乎也没有办法执行 java 风格的 catch (ExceptionType ME)

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

关于使用条件异常处理调试回原始错误,即重新抛出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10429229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com