3

C# での例外処理の範囲を教えてください。私は現在、私のチームの別のプログラマーからいくつかのコードをレビューしており、彼は次のようにレイアウトされた関数を持っています:

private void function1() {
try {
function2();
}
catch (Exception ex) {
EmailException(ex.message());
}}

private void function2() {
try {
// Do stuff
}
catch (Exception ex) {
// Handle it here
}}

処理コードの大部分は function2 にあります。ただし、彼のレポート処理は function1 にあります。function2 の例外は、レポートを送信する function1 ハンドラーにキックバックしますか?

編集: ご回答ありがとうございます。どれもとても役に立ちました。

4

5 に答える 5

4

// Handle it here例外を再スローしないと仮定するとfunction1、元の例外は表示されません。

でエラーが発生する可能性があるのと同じように、で新しい問題が発生function2する可能性があります。catchEmailExceptionfunction1

于 2012-06-06T15:44:02.920 に答える
4

場合のみ

a)function2元の例外を再スローするthrowか、または新しい例外をthrow new ...

b) の catch ブロック内またはその後で予期しない例外が発生します(ブロックは で最後に発生するfunction2ため、実際にはこのケースでは不可能です)。catchfunction2

于 2012-06-06T15:44:12.043 に答える
2

いいえ、例外はキャッチされるまでのみ伝播します。

catchただし、 inの最後で例外を再スローしfunction2て、目的の動作に導くことができます。

private void function2() {
    try {
        // Do stuff
    }
    catch (Exception ex) {
        // Handle it here
        throw;    // <- Re-throw the exception.
                  // Note this is different from `throw ex;`
    }
}
于 2012-06-06T15:43:48.577 に答える
2

function2 の例外は、レポートを送信する function1 ハンドラーにキックバックしますか?

いいえ

  • function2 の try ブロックの外で例外が発生する
  • function2 例外ブロック内で例外が発生する
  • trowたとえば、またはtrow exfunction2 の例外ブロックから例外がスローされる
  • function2 の try ブロックで例外が発生し、次のように自動的に復帰します。ThreadAbortException
于 2012-06-06T15:44:27.407 に答える
1

.net では、例外が発生すると、システムはtryスタック上のネストされたブロックを検索してcatch、例外をキャッチできるブロックがあるかどうかを判断します。これは、finallyブロックが実行される前に発生します。例外をキャッチできるブロックがない場合、システムはブロックを実行せずに「未処理の例外」ハンドラーを呼び出しfinallyます。

システムが例外をキャッチできるブロックがあると判断した場合、システムはスタックの巻き戻しを開始し、見つかったブロックまでスタックを巻き戻すか、例外が発生するまでfinally、内部ブロックに関連付けられたブロックを実行します。ブロックの実行時にスローされます。後者の場合、前の例外は破棄され、それ以上処理されません。例外処理は、新しくスローされた例外で新たに開始されます。trycatchfinally

例外をキャッチしたい場合と、単に例外を処理したい場合 (ただし、キャッチされていないとみなす) の間には意味上の違いがありますが、C# でその区別を明確に表現する方法はありません。例外をキャッチするコードは、それを解決することが期待されています。C# でできる最善の方法は、catch(システムの例外処理ロジックに、例外をキャッチすると考えるように指示する) を使用してから、 throw, を使用して、最終的に解決したくないことを示すことです (これは発生します)。内側の「finally」ブロックが実行された後)。vb.net などの他の一部の言語では、finallyブロックが実行される前に、例外をキャッチせずに例外に対処することができます。catchと_throwingせずに例外をキャプチャすることとは異なりますcatchが、区別が重要になるケースはほとんどありません。C# を使用していて、ファイナライザー ブロックが実行される前に内部コードから例外をキャプチャする可能性のある周囲のコードに敵対することを避けたい場合、最善の方法は、おそらく vb で記述された例外処理ラッパー メソッドを記述することです (または他の誰かに依頼することです)。それを行う)、それを DLL にコンパイルし、適切な try/filter/catch/finally ブロック内で呼び出すために、ラムダを使用してそのような関数メソッドをフィードします。

于 2012-06-06T17:26:14.487 に答える