未将Exception标记为抽象的原因

时间:2019-03-28 13:56:30

标签: c# .net exception

Microsoft的Best Practice说:

  

仅在不适用预定义的异常类时才引入新的异常类。

并且:

  

当需要自定义异常时,请适当命名它并从Exception类派生。

从Exception类派生是有意义的,因为这使我们可以处理特定的异常并(例如)记录并抛出其余异常:

try
{
    //something that might throw exceptions
}
catch(InvalidOperationException)
{
    //Do something
}
catch(Exception ex)
{
    //Log and throw other exception
    throw;
}

我想不出为什么要创建Exception基类的实例的原因。那么为什么Exception没有标记为抽象类?

我认为捕获抽象异常可能会导致某些特殊行为,但事实并非如此:

public abstract class AbstractException : Exception
{

}

public class MyException : AbstractException
{

}

//...

try
{
   throw new MyException();
}
catch (AbstractException)
{
   //Works fine
}

2 个答案:

答案 0 :(得分:2)

只有抽象成员时,才需要抽象类。 Exception没有那些,因此不需要成为抽象。

但是Microsoft 可以使其抽象化以符合他们自己的最佳实践。好吧,最佳实践并不是一成不变的,因此开发人员应该可以选择偏离它们。非抽象的Exception提供了这种可能性。

答案 1 :(得分:1)

在很多情况下,您不需要任何特殊或附加信息来“描述”计算流程中的特殊情况。 Exception类型非常适合此类情况,因此您不必为一般的例外情况定义新的类型。作为Exception的抽象类型,您无法实例化它,并且您必须从项目到项目中发明一些通用的异常类型,以使所有高级使用者都可以“理解”异常类型(从而为所有使用者提供了一种捕获和处理所有异常的方式,而无需考虑特殊化的异常类型。