2

MATLAB ファイルに、入れ子になった関数を呼び出す try/catch ステートメントがあります。簡単に言えば、try/catch は「トップ」レベルで実行され、関数を呼び出すファイルリストについて反復処理されます。

for i=1:length(FILELIST)
try
dosomething(FILELIST(i)
catch
disp(exception.message)
rethrow(exception)
end

私の質問は、dosomething() には多くのサブ関数 dosomethingchild() があるとします。どうすればそのデバッグ ワークスペースにアクセスできますか? 「STOP if errors/warnings」をフルに設定してデバッグ ワークスペースにアクセスするには、すべての親で try/catch ステートメントを削除する必要があります。

try/catch はデバッグを難しくしていますが、コード自体ではなく、ファイルの性質のために一部のファイルでコードが失敗することがあるため、それを維持したいと考えています。

前もって感謝します。

4

3 に答える 3

4

それを取り除くだけですtry..catch。エラーを表示して再スローするだけで、具体的なものを実際にキャッチすることはないため、ファイルの性質によって引き起こされるエラーに対して堅牢である実行可能な製品コードはありません。がない場合と同じように動作するtry..catchため、エラーが発生すると実行が停止します。

有効にstop if errorすると、エラー ハンドラーで停止しますが、既にお気づきのように役に立ちません。そこから、呼び出された関数のワークスペースに戻ることはできません。これらのワークスペースは既に閉じられているためです (呼び出しは既に返されています)。

実際の状況では、 とdbstop if caught error一緒に試すこともできますtry..catchが、この場合、 を取り除くtry..catchか、少なくとも特定のエラーをキャッチするようにすることをお勧めします。また、(特定の) エラーが発生したらすぐにキャッチすることもできます。実際の発生から遠ざかるほど、通常、特定のエラーの意味が薄れます。

于 2012-09-13T05:39:55.820 に答える
1

catch ステートメントに追加 keyboardして、コードが失敗したときに何が起こっているかを調べてみませんか。

于 2012-09-13T00:25:26.377 に答える
0

一般的に、try/catch ブロックがまったく役に立たないというEgonに同意します。ただし、デバッグの場合、それは最悪の考えではないかもしれません。このコードをデバッグするための私の提案:

  1. 再スローを削除しdbstop if error、エラーが発生したらすぐにデバッグ モードに切り替えるために実行します。または、 の行にブレークポイントを置きますdisp(execption.message)
  2. これで、次の 2 つのことができます。
    • スクリプトを実行し、間違いなく無効な入力ファイルが原因であるエラーが発生した場合、エラーをキャッチして実際に処理できます (通常、xyz.csv という名前のファイルが無視されたことを示すエラー メッセージを出力します)。
    • エラーの原因がわからない場合は、関数にブレークポイントを設定できますdoSomething()。これは、可能な限りエラーに近い方が望ましいです (エラーによってコール スタックが得られるため、かなり近くなるはずです)。その後、doSomething()手動で再度実行します。コンソールから。ブレークポイントで停止し、ステップスルー (ショートカット: F10) またはサブ関数にステップイン (ステップイン、F11) できます。
  3. 元のエラーが発生した後にエラー メッセージが表示される場合があるため、これらの手順を繰り返す必要があります。ただし、関数に入ると、その関数の完全なワークスペースが利用可能になるため、以前のすべてのコマンドを手動で (再度) 実行して、問題が発生した場所をバックトラックできます。
于 2016-07-06T09:21:38.977 に答える