1

これは私の現在の例外処理コードです。

throw e;でマークされた行に特に注意してください***

try
{
  //some code that could cause exception
}
catch (FaultException e) //first catch a particular type of exception only
{
  if (Regex.IsMatch(e.Message, "something")) //satisfying a particular condition
  {
    Console.WriteLine("Particular exception occurred.");
    return;
  }
  else
    throw e; // <-- *** Problem! Not getting caught by the "catch" below.
}
catch (Exception e) //catch all other exceptions
{
  Console.WriteLine("General exception ocurred");
  return;
}

問題は次のとおりです。throw e; // <-- ***が発生した場合、最終的なcatch. 代わりに、例外が処理されなかったかのようにアプリがクラッシュします。

これを最も簡単な方法で修正するにはどうすればよいですか?

最初に、特定の条件を満たす例外をcatch実際に処理することにのみ関心があることがわかりますが、他のすべて (条件満たさない例外と満たさない例外の両方) は final に任せます。残念ながら、これは正しく機能していません。FaultExceptionFaultExceptionFaultExceptioncatch

私は.NET 4を使用しています。

4

4 に答える 4

5

try/catch 構文を完全には理解していません。1 回の試行に複数のキャッチを添付できます。最も一致するキャッチが選択されます。この場合、FaultException の catch が発生し、例外が既に処理されているため、より一般的な Exception が呼び出されることはありません。

あなたがする必要があるのは、常にそれを処理したい場合は、より一般的な例外ケースのために、try/catch 全体を別の try/catch にラップすることです。それか、ロジックを作り直してください。(たとえば、単純化して Exception キャッチにしてから、それが FaultException かどうかを確認することができます。)

于 2012-11-10T02:28:03.047 に答える
2

ブロックごとに1つのブロックのみcatchが実行されtryます。

catchブロックを次のように書き直します。

catch (Exception e)
{
    if (e is FaultException && Regex.IsMatch(e.Message, "something"))
    {
        ....
    }
    else // all other exceptions
    {
        ....
    }
}
于 2012-11-10T02:30:55.403 に答える
1

例外的に同じレベルのキャッチになるthrow eことはありません。caught

throw内部は、catch常にメソッドの呼び出し元にスローされます。

また、再スローしたい場合は、throwの代わりに行うことをお勧めしますthrow e。最初のケースでは、コールスタックが保持されます。

于 2012-11-10T02:33:41.013 に答える
0

catchブロック内で例外をスローした場合、同じtry-catch内で例外がキャッチされることはありません。

他のcatchブロックで行っていることをelse条件で繰り返すことができます(この特定のケースではそれほど悪くはありません)。

于 2012-11-10T02:32:01.680 に答える