16.C#基础之异常(完成)

     C#的异常用于处理系统级或应用程序级的错误状态,它是一种结构化的、统一的和类型安全的处理机制。C#的异常机制非常类似于C++的异常机制,但有一些重要的区别:

       1.在C#中,所有异常都必须从System.Exception派生的类类型的实例来表示;而在C++,可以使用任何类型的任何值表示异常;

       2.在C#中,利用finally块可以编写在正常执行和异常情况下都要执行的终止代码;在C++很难在不重复代码的情况下编写这样的代码;

       3.在C#中,系统级的异常如溢出、被零除或null等,都对应地定义了与其匹配的异常类,并且与应用程序级的错误状态处于同等地位。

  16.1导致异常的原因

     可以用两种不同的方式引发异常:一种是用throw语句无条件引发异常,控制永远不会到达throw后面的语句;

                                   一种是处理C#语句和表达式过程中,某些操作无法正常完成时就会引发一个异常。

  16.2System.Exception类

     System.Exception类是所有异常的基类型。此类具有一些所有异常共享的值得注意得属性:

          *Message是string类型的一个只读属性,它包含关于发生异常的原因描述;

          *InnerException是Exception类型的一个只读属性。如果它的值不是null,则它所引发的是导致了当前异常的那个异常,即表示当前异常是在处理那个InnerException的catch块中被引发的。否则表示该异常不是由另一个异常引发的。以这种方式链接在一起的异常对象的数目可以是任意的。这些属性的值可以在调用System.Exception的实例构造函数时指定。

  16.3异常的处理方式

     异常是由try语句处理的。发生异常时,系统将搜索可以处理该异常的最近的catch子句(根据该异常的运行时类型来选择)。

     首先,搜索当前的方法以查询一个词法上封闭着它的try语句,并按顺序考察与该try语句相关联的每个catch子句。如果操作失败,则在调用了当前方法的方法中,搜索在词法上封闭的当前方法调用代码位置的try语句。此搜索一直进行下去,直到找到可以处理当前异常的catch子句(该子句指定一个异常类,它与当前引发该异常的运行时类型属于同一个类或所属类的一个基类)。注意,没有指定异常类的catch子句可以处理任何异常。

     找到匹配的catch子句后,系统将把控制转移到该catch子句的第一条语句。在catch子句的执行开始前,系统将首先按顺序执行嵌套在捕捉到该异常的try语句中所有try语句对应的finally子句。

     若果没有找到匹配的finally子句,会发生两种情况:一种时如果对匹配的catch子句的搜索到达一个静态构造函数或静态字段初始值设定项,则在导致调用该静态构造函数的代码位置引发System.TypeInitializationException。该System.TypeInitializationException的内部异常将包含最初引发的异常;另一种是对匹配的catch子句的搜索到最初启动当前线程的代码处,则该线程的执行就会终止,至于这样终止线程会造成什么影响要由具体的实现来确定。

     特别值得注意的是:在析构函数执行过程发生的异常。如果在析构函数执行过程中引发异常且未被捕捉,则终止该析构函数的执行,并调用它基类的析构函数。如果没有基类,或没有基类析构函数,则该异常将被忽略。

  16.4公共异常类

原文地址:https://www.cnblogs.com/dreamoffire/p/10148439.html