在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
。但是,这将调试到任何捕获的错误,如果软件大量使用异常,这可能会很多。我只想停止未捕获的错误,但我想停止生成错误的位置 - 而不是重新生成的位置。
我的问题:
答案 0 :(得分:3)
我猜你不能这样做。一旦执行进入catch
语句,dbstack
将必须引用catch中的该位置,因此调试错误原因所需的信息将丢失。 ME.stack
会告诉您异常的来源,但这并不足以在该位置进行调试。
所以我怀疑你可以通过在捕获内部做一些聪明的事来解决问题。查看catch的文档,似乎也不是一种java风格catch (ExceptionType ME)
的方法。
通过编程方式使用调试命令,可能有一些hacky方法可以解决这个问题。例如,S = dbstatus
保存调试状态,如果有从存储状态恢复的方法,则可以将此附加到异常。但我无法找到任何记录的方法来做到这一点。