C# 中的表达式为处理系统级别和应用程序级别的错误条件,提供了一个构造的、统一的合类型安全的方法。C#中的异常机制与C++中的相当相似,但是有一些重要的不同之处:
· 在 C# 中,所有的异常必须用一个从System.Exception派生的类类型的实例表示。在C++中,任何类型的任何数值都可以用于表示异常。
· 在C# 中,一个最后的块 (§错误!未找到引用源。) 可以被用来编写在正常指向和异常条件下都可以执行的中止代码。如果没有重复代码,那样的代码在C++中很难写。
· 在 C#中,如溢出、被零除和空解除参照等系统级的异常会有被很好定义的异常类,并且应用程序级别错误条件等同。
1.1 异常的产生
异常可以用两种不同的方法抛出。
· 一个throw 语句 (§错误!未找到引用源。) 会直接无条件地抛出一个异常。控制不会接触到紧跟在throw后面的语句。
· 当操作符不能正常结束时,在某种特殊情况下,在C#语句和表达式执行的过程中产生的某种异常的条件产生一个异常。例如,一个整数除法操作(§错误!未找到引用源。)在分母为零时抛出一个System.DivideByZeroException 异常。§16.4 中给出了一个可以在这种方式下发生的各种异常的列表。
1.2 System.Exception 类
类System.Exception 似所有异常的基本类型。这个类有一些值得注意的属性,这些属性所有异常都有:
· Message 是一个只读属性,它是一个只读属性,可以包含一个可以被人读的异常原因的描述。
· InnerException 是一个只读属性,它包含这个异常的“内部异常”。如果它不是null,就指出当前的异常是作为对另外一个异常的回答而被抛出。产生当前异常的异常可以在InnerException 属性中得到。
这些属性的数值可以在System.Exception 构造函数中指定。
1.3 异常怎样被处理
异常被try语句 (§错误!未找到引用源。)处理。
当发生一个异常,系统就会查找离可以处理这个异常的语句最近的catch语句,并且有异常的运行时类型决定。首先,当前的方法是查找文字上很近,并且与try语句相关的catch语句会被按顺序考虑。如果这样做失败了,就会查找调用try语句的方法和当前的方法中文字接近的地方,这个try语句围绕着对当前方法调用的点。通过对与异常被抛出的运行时类型的相同的类或基类的命名来进行查找,这个查找一直进行直到找到可以处理当前的异常的catch语句为止。一个没有对一个异常类命名的catch语句可以处理任何异常。
一旦找到匹配的catch语句,系统就被控制权交给catch语句的第一个语句。在这个catch语句开始执行前,系统首先执行与try语句相关,而且比俘获异常的语句嵌套更深的任何finally语句。
如果没有找到匹配的catch语句,下面两件事情中的一件就会发生:
· 如果对匹配的catch语句的查找找到了一个静态构造函数(§10.12)或静态域初始化函数,那么就会在引发对静态构造函数调用的地方抛出一个System.TypeInitializationException 异常。TypeInitializationException 的内部异常包含最初抛出的异常。
· 如果对匹配的catch语句的查找找到了一个最初开始这个线程或程序的代码,那么这个线程或程序的执行就被中止。
1.4 通用异常类
下面的异常被某些C# 操作抛出。
System.OutOfMemoryException |
当试图通过new来分配内存而失败时抛出。 |
System.StackOverflowException |
当执行栈被太多未完成的方法调用耗尽时抛出;典型情况是指非常深和很大的递归。 |
System.NullReferenceException |
当null引用在造成引用的对象被需要的情况下使用时抛出。 |
System.TypeInitializationException |
当一个静态构造函数抛出一个异常,并且没有任何catch语句来俘获它的时候抛出。 |
System.InvalidCastException |
当一个从基本类型或接口到一个派生类型的转换在运行时失败时抛出。 |
System.ArrayTypeMismatchException |
当因为存储元素的实例类型与数组的实际类型不匹配而造成象一个数组存储失败时抛出。 |
System.IndexOutOfRangeException |
当试图通过一个比零小或者超出数组边界的标签来索引一个数组时抛出。 |
System.MulticastNotSupportedException |
当试图合并两个非空代表失败时抛出;因为代表类型没有void返回类型。 |
System.ArithmeticException |
一个异常的基类,它在算术操作时发生,如DivideByZeroException 和 OverflowException. |
System.DivideByZeroException |
当试图用整数类型数据除以零时抛出。 |
System.OverflowException |
当checked中的一个算术操作溢出时抛出。 |
评论