不将Exception标记为抽象的原因

问题描述 投票:1回答:2

微软的Best Practice说:

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

和:

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

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

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
}
c# .net exception
2个回答
2
投票

仅当有抽象成员时才需要抽象类。 Exception没有这些,所以它不需要抽象。

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


1
投票

当您不需要任何特殊或附加信息来“描述”计算流程中的异常情况时,有很多情况。 Exception类型非常适合这种情况,因此您不必为通用异常情况定义新类型。作为一个抽象类型,Exception不允许你实例化它,你必须从项目到项目发明一些通用异常类型,以便所有高级消费者都能“理解”异常类型(即提供一个所有消费者捕获和处理所有异常的方法,无论异常类型专门化如何)。

© www.soinside.com 2019 - 2024. All rights reserved.