异常层次结构

更新:2007 年 11 月

有两种类型的异常:由执行程序生成的异常和由公共语言运行库生成的异常。另外,还有由应用程序或运行库引发的异常的层次结构。

Exception 是异常的基类。若干个异常类直接从 Exception 继承,其中包括 ApplicationExceptionSystemException。这两个类构成几乎所有运行库异常的基础。

大多数直接从 Exception 派生的异常不为 Exception 类添加任何功能。例如,InvalidCastException 类层次结构如下所示:

Object    Exception       SystemException          InvalidCastException

错误发生时,运行库引发 SystemException 的适当派生类。这些错误是失败的运行库检查(如数组超出界限错误)导致的,它们可在任何方法的执行过程中发生。如果设计创建新异常的应用程序,应从 Exception 类派生那些异常。不建议捕捉 SystemException,在应用程序中引发 SystemException 也不是好的编程做法。

最严重的异常,即那些由运行库引发或处于不可恢复的条件的异常,包括 ExecutionEngineExceptionStackOverflowExceptionOutOfMemoryException

交互操作异常从 SystemException 派生并由 ExternalException 进一步扩展。例如,COMException 是 COM 互操作操作过程中引发的异常,它从 ExternalException 派生。Win32ExceptionSEHException 也从 ExternalException 派生。

运行库异常层次结构

运行库有一组从 SystemException 派生的基异常,它在执行各指令时引发这些异常。下表按层次结构列出了运行库提供的标准异常以及派生类的创建条件。

异常类型

基类型

说明

示例

Exception

Object

所有异常的基类。

无(使用此异常的派生类)。

SystemException

Exception

所有运行时生成的错误的基类。

无(使用此异常的派生类)。

IndexOutOfRangeException

SystemException

仅当错误地对数组进行索引时,才由运行库引发。

在数组的有效范围外对数组进行索引:

arr[arr.Length+1]

NullReferenceException

SystemException

仅当引用 null 对象时,才由运行库引发。

object o = null;

o.ToString();

AccessViolationException

SystemException

仅在访问无效内存时由运行库引发。

当与非托管代码或不安全的托管代码互操作时或者使用无效指针时发生。

InvalidOperationException

SystemException

当处于无效状态时,由方法引发。

从基础集合移除 Item 后调用 Enumerator.GetNext()。

ArgumentException

SystemException

所有参数异常的基类。

无(使用此异常的派生类)。

ArgumentNullException

ArgumentException

由不允许参数为 null 的方法引发。

String s = null;

"Calculate".IndexOf (s);

ArgumentOutOfRangeException

ArgumentException

由验证参数是否位于给定范围内的方法引发。

String s = "string";

s.Chars[9];

ExternalException

SystemException

在运行库的外部环境中发生或针对这类环境的异常的基类。

无(使用此异常的派生类)。

ComException

ExternalException

封装 COM HRESULT 信息的异常。

在 COM 互操作中使用。

SEHException

ExternalException

封装 Win32 结构化异常处理信息的异常。

在非托管代码 interop 中使用。

请参见

概念

异常类和属性

异常概述

处理异常的最佳做法

其他资源

异常处理基础知识

处理和引发异常