2009-03-17 19 views
1

私は、特定の例外をキャッチし、より高い何かを処理するコールスタックのためのより有用なものを投げているだけでなく、より一般的な例外をキャッチして処理するいくつかのコードを書こうとしています。例外処理の問題

コードはこのようなものです:

try 
{ 
    // Do stuff 
} 
catch (SomeException e) 
{ 
    throw new SomeExceptionWithContextInfo(); 
} 
catch (Exception e) 
{ 
    // Handle unexpected exception gracefully 
} 

私がいる問題は、一般的な例外が私の新しい例外をキャッチしていることです。これを避ける方法はありますか?

私の現在の解決策には、例外のタイプをチェックして、それがタイプであれば再び投げます。

+1

私は正しい例外を捕まえることができないように働いています。 –

答えて

6

このテストアプリケーションに示すように、あなたが、動作するはず掲載しましたコード:

using System; 

class OtherException : Exception {} 

class Test 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      Foo(); 
     } 
     catch (OtherException) 
     { 
      Console.WriteLine("Caught OtherException"); 
     } 
    } 

    static void Foo() 
    { 
     try 
     { 
      string x = null; 
      int y = x.Length; 
     } 
     catch (NullReferenceException) 
     { 
      throw new OtherException(); 
     } 
     catch (Exception) 
     { 
      Console.WriteLine("Caught plain Exception"); 
     } 
    } 
} 

これだけ版画 "OtherExceptionつかまえました" "平野の例外を捕らえた"ではありません。本当のコードにネストされたtryブロックがないのは確かですか?あなたの問題を示す短い完全な例を投稿できますか?

実際にあなたのメソッドで例外をキャッチする必要がありますか?それは非常にまれなことです。

+0

それは正しいですが、Mainメソッドにtry/catchがない場合、プレーンな例外がキャッチされます。それが起こっていると思います。 – Groo

+0

Mainメソッドにtry/catchがない場合、例外はまったく処理されないため、アプリケーションは中止されます。 –

+0

私はそれが別の例外であったことが判明しました –

2

あなたが投稿したコードがそれを行う方法です(より具体的な例外が最初に現れなければならない)。

コードをもう一度見直すことをお勧めします。その順番になっていないか、実際にコードがその例外タイプを投げているわけではありません。ここで

はのtry-catchについてのMSDNのリンクを次のとおりです。 http://msdn.microsoft.com/en-us/library/0yd65esw(VS.80).aspx

0

一般的な例外を検出しないでください。どの例外をスローして別々に捕捉できるかを調べる。

try { // Outer try/catch 
    DoSomething(); 

    try { 
     /* */ 
    } catch(NotGeneralException e) { 
     /* */ 
    } catch(AnotherNotGeneralException e) { 
     throw new SomeOtherException("Exception message"); 
    } 
} catch(SomeOtherException e) { 
    /* */ 
} 

代わりにのみあなたは右のそれをやっている一般的な例外と再スローSomeOtherExcepion

try { 

} catch(Exception e) { 
    throw new SomeOtherException("Exception message"); 
} 
+0

私はJonとしてサンプルアプリケーションを投稿するのに遠くまで行きませんでしたが、意図した通りに作業を捕まえ、回避策は必要ありません。 – eglasius

2

をキャッチ。一般的な例外は、特定の例外をキャッチしません。