微软的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
}
仅当有抽象成员时才需要抽象类。 Exception
没有这些,所以它不需要抽象。
但微软可以将其抽象化以符合他们自己的最佳实践。好吧,最佳实践并非一成不变,因此开发人员应该可以选择偏离它们。非抽象的Exception
提供了这种可能性。
当您不需要任何特殊或附加信息来“描述”计算流程中的异常情况时,有很多情况。 Exception
类型非常适合这种情况,因此您不必为通用异常情况定义新类型。作为一个抽象类型,Exception
不允许你实例化它,你必须从项目到项目发明一些通用异常类型,以便所有高级消费者都能“理解”异常类型(即提供一个所有消费者捕获和处理所有异常的方法,无论异常类型专门化如何)。