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

Debugging 使用条件异常处理(即重新抛出)调试回原始错误,debugging,matlab,error-handling,Debugging,Matlab,Error Handling,据我所知,在Matlab中,没有条件捕获异常的好方法(如果我错了,请纠正我)。唯一的方法是捕获异常,检查标识符,如果无法处理此特定错误,则重新显示错误。这是可以接受的,尽管不方便。但是,当我使用Matlabsdbstop if error时,我会在ME.rethrow()行结束。然后,我无法dbup返回导致原始错误的位置 function test_excc try sub_test() catch ME if strcmp(ME.identifier, 'test:notso

据我所知,在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
。然而,这将调试成任何捕获到的错误,如果软件大量使用异常,这些错误可能会很多。我只想在未捕获的错误上停止,但我想在生成错误的地方停止,而不是在重新捕获错误的地方

我的问题:

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

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

      因此,我怀疑你能通过巧妙地在捕获物内做些事情来解决这个问题。查看catch的文档,似乎也没有一种方法可以实现java风格的
      catch(ExceptionType ME)


      通过以编程方式使用调试命令,可能会有一些黑客方法来解决这个问题。例如,
      S=dbstatus
      保存调试状态,如果有办法从保存状态恢复,则可以将其附加到异常。但是我找不到任何有文档记录的方法来实现这一点。

      在我调用我.rethrow()时,Matlab解释器会将整个回溯输出到屏幕上。所以在这一点上,信息就在某个地方。它可能是没有文档记录的,不受支持的,但实际访问此信息…我不认为所有调试信息都可用。只有堆栈跟踪存储在ME中。要在代码中的某个位置进行调试,需要更多关于状态的信息。如果你有类似于
      抓住我;my_函数();我,再喊一次;结束
      ,在重试之前,您可以在catch中执行许多操作-如果发生异常,调试器必须能够从
      my_function()
      中的任何位置进行调试,因此我猜,在捕获异常后,调试器状态必须继续更新。上次我不得不这样做时,我通过编写代码来解决这个问题,代码中有很多子函数和一种主函数,用于将巨型switch语句保存在catch中。因此:ME.identifier或ME.message上的某些strcmp会有条件地将某些内容发送回例程的不同部分。这是非常骇人的,但至少它是有效的。。。。