2017-08-14 3 views
0

エラーを表示 "以前のcatch節はすでに既にcatch節がすべてのcatch私のC#のコードでは、スーパータイプ `のSystem.Exception」」エラーを表示する "以前のcatch節は既にこの型のすべての例外またはSystem.Exception"のスーパー型をキャッチしているC#コード

using System; 
class Test { 
    static void Main() { 
     try{ 
      int a=10,b=0,c=0;c=a/b ; 
      Console.WriteLine(c); 
     } 
     catch(System.Exception e) { 
      Console.WriteLine(e.Message); 
     } 
     catch(System.DivideByZeroException ex) { 
      Console.WriteLine(ex.Message); 
     } 
    } 
} 
+4

問題は順序です。最初に 'DivideByZeroException'を入れてください。注文は、より具体的ではないより具体的でなければなりません。 – juharr

答えて

2

例外ハンドラは、上から下へ順番に処理され、唯一の最初に一致した例外ハンドラが呼び出されます。あなたの最初のハンドラはSystem.Exceptionをキャッチし、すべての例外はSystem.Exceptionから派生しているので、すべてが捕捉され、2番目のハンドラは決して実行されません。

複数の例外ハンドラのためのベストプラクティスは、このように、一般的に特定のからそれらを注文することです:

using System; 
class Test { 
    static void Main() { 
     try{ 
      int a=10,b=0,c=0;c=a/b ; 
      Console.WriteLine(c); 
     } 
     catch(System.DivideByZeroException ex) { 
      Console.WriteLine(ex.Message); 
     } 
     catch(System.Exception e) { 
      Console.WriteLine(e.Message); 
     } 
    } 
} 

あなたは絶対に積極的に対処する必要がある場合System.Exception最初の(私は理由を考えることはできませんが、

using System; 
class Test { 
    static void Main() { 
     try{ 
      int a=10,b=0,c=0;c=a/b ; 
      Console.WriteLine(c); 
     } 
     catch(System.Exception e) 
     when (!(e is DivideByZeroException)){ 
      Console.WriteLine(e.Message); 
     } 
     catch(System.DivideByZeroException ex) { 
      Console.WriteLine(ex.Message); 
     } 
    } 
} 

注:MSDN、you should avoid catching general exception types like System.Exceptionパー)あなたは、このように、通過DIVIDEBYZEROを許可する例外フィルタを書くことができます。

関連する問題