异常层次结构
更新:2007 年 11 月
有两种类型的异常:由执行程序生成的异常和由公共语言运行库生成的异常。另外,还有由应用程序或运行库引发的异常的层次结构。
Exception 是异常的基类。若干个异常类直接从 Exception 继承,其中包括 ApplicationException 和 SystemException。这两个类构成几乎所有运行库异常的基础。
大多数直接从 Exception 派生的异常不为 Exception 类添加任何功能。例如,InvalidCastException 类层次结构如下所示:
Object Exception SystemException InvalidCastException
错误发生时,运行库引发 SystemException 的适当派生类。这些错误是失败的运行库检查(如数组超出界限错误)导致的,它们可在任何方法的执行过程中发生。如果设计创建新异常的应用程序,应从 Exception 类派生那些异常。不建议捕捉 SystemException,在应用程序中引发 SystemException 也不是好的编程做法。
最严重的异常,即那些由运行库引发或处于不可恢复的条件的异常,包括 ExecutionEngineException、StackOverflowException 和 OutOfMemoryException。
交互操作异常从 SystemException 派生并由 ExternalException 进一步扩展。例如,COMException 是 COM 互操作操作过程中引发的异常,它从 ExternalException 派生。Win32Exception 和 SEHException 也从 ExternalException 派生。
运行库异常层次结构
运行库有一组从 SystemException 派生的基异常,它在执行各指令时引发这些异常。下表按层次结构列出了运行库提供的标准异常以及派生类的创建条件。
异常类型 |
基类型 |
说明 |
示例 |
---|---|---|---|
Object |
所有异常的基类。 |
无(使用此异常的派生类)。 |
|
Exception |
所有运行时生成的错误的基类。 |
无(使用此异常的派生类)。 |
|
SystemException |
仅当错误地对数组进行索引时,才由运行库引发。 |
在数组的有效范围外对数组进行索引: arr[arr.Length+1] |
|
SystemException |
仅当引用 null 对象时,才由运行库引发。 |
object o = null; o.ToString(); |
|
仅在访问无效内存时由运行库引发。 |
当与非托管代码或不安全的托管代码互操作时或者使用无效指针时发生。 |
||
SystemException |
当处于无效状态时,由方法引发。 |
从基础集合移除 Item 后调用 Enumerator.GetNext()。 |
|
SystemException |
所有参数异常的基类。 |
无(使用此异常的派生类)。 |
|
ArgumentException |
由不允许参数为 null 的方法引发。 |
String s = null; "Calculate".IndexOf (s); |
|
ArgumentException |
由验证参数是否位于给定范围内的方法引发。 |
String s = "string"; s.Chars[9]; |
|
SystemException |
在运行库的外部环境中发生或针对这类环境的异常的基类。 |
无(使用此异常的派生类)。 |
|
ExternalException |
封装 COM HRESULT 信息的异常。 |
在 COM 互操作中使用。 |
|
ExternalException |
封装 Win32 结构化异常处理信息的异常。 |
在非托管代码 interop 中使用。 |