博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

第6章   异常捕获与处理

【简述】异常处理是开发软件产品必须认真考虑的问题,它在很大程序上直接决定了软件产品的健壮性。

本章主要介绍了.NET异常处理基础架构及提出异常处理的一些建议。

第一节    .NET异常处理基础

1、 异常概述:

A、  定义:程序运行时所引发的错误。异常不等同于Bug,它是Bug的一种表现形势。

B、  机制:.它由CLR负责实现,是独立于编程语言的。当程序出现运行错误时,CLR会创建一个异常对象,异常对象通常是一个Exception类(或其派生的子类)的实例。

C、  若异常出现,应用程序没有编写代码处理异常,CLR会强行结束整个进程。

2、 try、catch和finally

try

{

   //可能引发异常的语句   ---------try语句块(1)

}

Catch(exception e)

{

   //对异常进行处理的语句  ---------catch语句块(2)

}

Finally

{

  //打扫“战场”的语句    --------- finally语句块(3)

}

【解释】:
A、若正常运行,执行流程为第(1)块→第(3)块

B、若非正常运行,执行流程为第(1)块→第(2)块→第(3)块

C、其中finally语句是可选的,主要用于解决资源泄露问题,如文件句柄。

3、异常基类Exception:

   A、Exception的重要属性和方法
      A.1 e.GetTpye()   获取异常的类型

      A.2 e.Message    告诉用户发生了什么事

      A.3 e.StackTrace  确定错误发生的位置,如果有可用的调试信息(程序名.pdb文件存在),还可显示源文件名和程序行号

      A.4 TargetSite  获取引发当前异常的方法。

   B、常用异常类

      B.1 ArithmeticException: 在算术运算期间发生的异常(如DivideByZeroException 和 OverflowException)的基类

      B.2 DivideByZeroException 在试图用零作除数时引发

      B.3 IndexOutOfRangeException 在试图使用小于或超出数组界限的下标索引数组时引发

      B.4 InvalidCastException 从基类型或接口到派生类型的显式转换在运行时失败,引发此异常。

      B.5 NullReferenceException 尝试使用未创建的对象,引发此异常

      B.6 OutOfMemoryException 分配内存(通过new)失败时引发

      B.7 StackOverflowException 当执行堆栈由于保存了太多挂起的方法调用而耗尽时,就会引发此异常,通常表明存在非常深或无限的递归。

第二节   应对程序运行时出现的异常

1、 捕获多种类型的异常

A、  C#使用catch语句只能捕获Exception类及其子类的对象。

B、  Catch只能有一个参数,即一条catch语句只能捕获此参数限定的那种类型的异常。

C、  在某个try块后有两个不同的catch块捕获两个相同类型的异常是语法错误。

D、  越特殊的异常类型放在越前面。

2、异常处理机制:

A、.NET4.0默认的异常处理机制是仅处理托管代码的异常,而非托管代码的异常由操作系统处理。

B、CLR采用“两轮遍历”异常处理策略。

   B.1 扫描并查找相匹配的catch子句的过程,是CLR异常处理流程的第一轮。

   B.2 扫描并查找相匹配的finally子句过程,是CLR处理异常流程的第二轮。

第三节   实际开发中有关异常处理的建议

1、  采取的异常应对策略:当异常发生时,捕获它,并根据情况进行处理。

2、  遵循异常处理的基本原则

A、  预防所有可以预料和防止的错误。

B、  处理所有可以预料但不能防止的错误。

C、  捕获所有不能预料的错误。

3、 仅在必要的时候自定义异常。

4、 尽可能地就近处理异常。