5

私は一般的な例外ハンドラ関数を持っています:

public static void ManageException(Exception ex,
                                   string customErrorMsg,
                                   bool displayMessage)

一部の catch ブロックから呼び出したい。

例外を処理した後、スタック トレースを保持しながら、例外を再スローしたいと考えています。

throwパラメータなしでステートメントを作成する必要があることをどこかで読みました。throwステートメント (パラメーターなし) はブロック内で正常に動作しますcatchが、私のManageException関数ではコンパイル エラーが発生します。

引数のない throw ステートメントは、catch 句の外では許可されていません

ManageException関数から、パフォーマンスに影響を与えることなく、スタック トレース全体で例外を再スローする解決策はありますか?

C#2.0を使用しています。

4

5 に答える 5

6

次のように、スローする例外を指定する必要があります。

throw ex;

throw;エラーに記載されているように、catch ブロック内からのみ例外を再スローできます (を使用)。IMHOこれは、そうすることが理にかなっている唯一の場所です。例外をキャッチするかスローするかのどちらかであり、おそらく両方を行うべきではありません。というメソッドから、ManageExceptionなぜ上記の例外を管理しているのに、とにかくそれをスローするのだろうか。

代わりに、元の例外を独自の例外でラップして、追加の詳細を提供したいのではないでしょうか? この場合、そのデータを保持したい場合exは、 asを使用して新しい例外をスローします。InnerException


あなたのコメントから、あなたがやろうとしていることが、例外を再スローする必要があるかどうかを判断することである場合、私はお勧めします:

  • メソッドの名前TryManageExceptionを変更し、署名を返すように変更しますbool- 例外が適切に管理されておらず、再スローする必要がある場合は false を返します。処理された場合は true を返します。
  • メソッドが false (= 管理されていない) を返す場合は、catch ブロックから再スローするか、その他の必要なことを行います。

    try
    {
        decimal oops = 5 / 0;
    }
    catch (Exception e)
    {
        if (!CommonExceptionHandler.TryManageException(e, "oops", "oops"))
            throw;
    }
    
于 2013-01-01T18:05:28.263 に答える
1

オプションは次のとおりです。

A.キャッチブロックを投入します。

try
{
    //do stuff
}
catch (Exception ex)
{
    ManageException(ex);
    throw;
}

B.ハンドラーメソッドで再スローします。

private void ManageException(Exception ex)
{
    //log or whatever
    throw new Exception("See inner exception", ex);
}

C.より高いレベルでの処理:

たとえば、ASP.NETでは、Global.asaxのApplication_Errorイベントハンドラーメソッドを使用します。
未処理の例外はすべて終了し、そこで処理できます。

于 2013-01-01T18:35:19.677 に答える
0

catch ブロックの内側からのみ再スローできます。考えてみてください。catch ブロックにいない場合は、プログラムがクラッシュしたか、例外がより高いレベルでキャッチされました。catch ブロックの外側から再スローしても意味がありません。

関数を try/catch でラップし、必要に応じて catch から再スローします。さらに、あなたがしているのは再スローだけであれば意味がありません。例外が発生するようにします。

于 2013-01-01T18:05:54.930 に答える
0

できません。

MSDNから

catch ブロックで throw ステートメントを使用して、catch ステートメントによってキャッチされた例外を再スローすることができます。

スタックトレースを保存したい場合は、ラップする必要がありますInnerException

public static void ManageException(Exception ex, string customErrorMsg, bool displayMessage)
{
   ...
   throw new Exception ("Re-throwing", ex); // You can use your custom Exception object with custom message.
}

の呼び出し元は の代わりにManageException処理する必要があります。ex.InnerExceptionex

于 2013-01-01T18:06:02.833 に答える