下列指导方针为 .NET Framework 所提供的一些最常用的异常而描述了最佳的实践。关于 .NET Framework 所提供的完整的异常类列表,请参考:[.NET Framework 类库参考文档]。
Exception 与 SystemException
不要抛出 System.Exception 或者 System.SystemException。
不要在框架的代码中捕获 System.Exception 或者 System.SystemException,除非你打算用来重新抛出异常。
避免捕获 System.Exception 或者 System.SystemException,除非是在顶层的异常处理器中。
ApplicationException
不要抛出或者继承自 System.ApplicationException。
InvalidOperationException
如果在一个不适当的场合中,不要抛出一个 System.InvalidOperationException 异常。如果一个属性设置或者一个方法调用没有适当地提供对象的当前状态,应该抛出 System.InvalidOperationException。例如,对于一个已经作为读取需要而被打开的 System.IO.FileStream 执行写入操作就应该抛出一个 System.InvalidOperationException 异常。
异常同样应该在相关对象集的被组合状态对于操作来说是无效的时候才被抛出。
ArgumentException、ArgumentNullException,以及 ArgumentOutOfRangeException
如果不正确的参量被传递给一个成员,抛出 System.ArgumentException 或者它的一个子类型。如果适用,宁愿是最终被派生的异常类型。
下列代码范例示范了在一个参量是 null 值(在 Visual Basic 中是 Nothing)的时候抛出一个异常。
C#
if (anObject == null) { throw new ArgumentNullException("anObject", "Specify a non-null argument."); }
在抛出 System.ArgumentException 或者它的一个派生类型的时候设置 System.ArgumentException.ParamName 属性。这个属性存储了导致异常被抛出的参数名称。注意:这个属性能够通过使用任何一个构造器重载来进行设置。
为属性设置器的隐式 value 参数的名称使用 value。
下列代码范例说明了能够在调用者传递了一个 null 值参量的时候抛出一个异常的属性。
C#
public IPAddress Address { get { return address; } set { if(value == null) { throw new ArgumentNullException("value"); } address = value; } }
不允许公开可调用的 API 来明确地或者隐式地抛出 System.NullReferenceException、System.AccessViolationException、System.InvalidCastException,或者 System.IndexOutOfRangeException。应该实行参量检查来避免抛出这些异常。因为抛出这些异常可以暴露出你的方法中的实现细节,同时这些方法也会随着时间而发生变化。
StackOverflowException
不要明确地抛出 System.StackOverflowException。这个异常应该只能够通过公共语言运行时(CLR)而被抛出。
不要捕获 System.StackOverflowException。
通过编程的方式来处理堆栈的溢出将会是非常困难的。你应该允许通过这个异常来终止进程并且使用调试机制来检查问题的来源。