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のドキュメントを見ると、Javaスタイルを実行する方法もないようですcatch (ExceptionType ME)

プログラムでデバッグコマンドを使用してこれを解決するためのいくつかのハッキーな方法があるかもしれません。たとえばS = dbstatus、デバッグ状態を保存し、保存された状態から再開する方法がある場合は、これを例外にアタッチできます。しかし、それを行うための文書化された方法を見つけることができません。

于 2012-05-03T11:14:35.297 に答える