在我的 C# 代码中显示错误“前一个 catch 子句已经捕获了这个或超类型 `System.Exception' 的所有异常”

Posted

技术标签:

【中文标题】在我的 C# 代码中显示错误“前一个 catch 子句已经捕获了这个或超类型 `System.Exception\' 的所有异常”【英文标题】:Showing the error "A previous catch clause already catches all exceptions of this or a super type `System.Exception' " in my C# code在我的 C# 代码中显示错误“前一个 catch 子句已经捕获了这个或超类型 `System.Exception' 的所有异常” 【发布时间】:2018-01-22 10:49:18 【问题描述】:

在我的 C# 代码中显示错误“前一个 catch 子句已经 catch 子句已经捕获了 this 或超类型 `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); 
         
     

【问题讨论】:

顺序有问题,把DivideByZeroException放在前面。顺序应该总是更具体到不太具体。 【参考方案1】:

异常处理程序按从上到下的顺序处理,并且仅调用第一个匹配的异常处理程序。因为您的第一个处理程序捕获了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

【讨论】:

以上是关于在我的 C# 代码中显示错误“前一个 catch 子句已经捕获了这个或超类型 `System.Exception' 的所有异常”的主要内容,如果未能解决你的问题,请参考以下文章

为啥 event.target.files[0].name 在我的代码中显示错误?

如何解决此 C# 代码中的 CORS 错误?

使用 c# 创建新的 sql server 表

如何修复 C# 中的“指定强制转换无效”错误?

在 C# WebApp 中显示 PDF 文档时出错

有没有办法在我的 C# 应用程序中复制无法读取内存的错误消息?