在我的 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' 的所有异常”的主要内容,如果未能解决你的问题,请参考以下文章