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
}
答案 0 :(得分:2)
只有抽象成员时,才需要抽象类。 Exception
没有那些,因此不需要成为抽象。
但是Microsoft 可以使其抽象化以符合他们自己的最佳实践。好吧,最佳实践并不是一成不变的,因此开发人员应该可以选择偏离它们。非抽象的Exception
提供了这种可能性。
答案 1 :(得分:1)
在很多情况下,您不需要任何特殊或附加信息来“描述”计算流程中的特殊情况。 Exception
类型非常适合此类情况,因此您不必为一般的例外情况定义新的类型。作为Exception
的抽象类型,您无法实例化它,并且您必须从项目到项目中发明一些通用的异常类型,以使所有高级使用者都可以“理解”异常类型(从而为所有使用者提供了一种捕获和处理所有异常的方式,而无需考虑特殊化的异常类型。