2017-08-14 18 views
0

显示错误“先前的catch子句已经catch子句已经捕获到这个或所有的异常在我的C#代码超类型`System.Exception的“”在我的C#代码中显示错误“以前的catch子句已经捕获了这个或超类型`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) { 
      Console.WriteLine(e.Message); 
     } 
     catch(System.DivideByZeroException ex) { 
      Console.WriteLine(ex.Message); 
     } 
    } 
} 
+4

问题在于顺序,首先放置'DivideByZeroException'。订单应该总是更具体一些,不太具体。 – juharr

回答

2

异常处理程序,以便从顶部到底部,并且只有第一匹配异常处理程序被调用处理。因为你的第一个处理程序捕获了System.Exception,并且所有的异常都来自于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.DivideByZeroException ex) { 
      Console.WriteLine(ex.Message); 
     } 
     catch(System.Exception e) { 
      Console.WriteLine(e.Message); 
     } 
    } 
} 

如果你绝对肯定要处理System.Exception第一(虽然我想不出一个理由),你可以写一个异常过滤器通过允许DivideByZero,像这样:

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

相关问题