为什么需要异常处理(转载)

来源:互联网 发布:手机怎么开通淘宝卖家 编辑:程序博客网 时间:2024/05/19 04:26

在实际的软件项目开发中,不论程序员是久经沙场的老将,还是初出茅庐的小鸟,出现Bug是必然的,我们如何才能做到系统在运行时遇到错误而不致使系统崩溃呢,我们需要在系统编码中定制异常处理。

在软件项目开发中,项目的成功与失败的一个很关键的因素就是项目的质量。如何确保整个项目的质量,首先我们需要确保项目中的某一个模块以及某个类、某一个方法的质量.这时我们需要进行单元测试。

本章我们重点学习异常处理以及在VSTS(Visual StadioTeam System)下写单元测试。

一、为什么需要异常处理

回顾C#基础教程《C#基础教程开发数据库应用程序》第6章对异常处理的介绍,本章我们进一步学习C#中异常处理的使用,为了我们能够更好地理解异常处理,下面以银行场景为例。

中国人民银行为客户提供ATM柜员机服务,假设客户张三要将自己卡中的部分金额转到王五的卡里。目前张三卡里的余额为6000元,但他(她)试图将8000元转入王五的卡里。由于张三卡里的余额不足,因此程序出现故障导致系统崩溃。由于系统出现故障,因此其他客户也无法使用ATM柜员机。

这表明该ATM柜员机的系统功能存在缺陷,在发生异常时不能够自动处理。如果应用系统能对用户的操作做检查、判断,并在错误发生时出现提示信息。通过提示信息指导用户正确使用,那样系统就不会崩溃。

一个性能良好、运行稳健的应用系统允许异常发生,当异常发生时能够自动处理、避免系统终止运行。我们如何才能开发一个性能良好的应用系统呢?首先要预知可能发生的特殊情况,并在程序编码中处理这些特殊情况。

.NET中为我们提供了捕获和处理异常的方法。如果我们开发的应用程序出现异常,但这种异常是我们在开发过程中没有预知到、也没有做相应处理的。此时CLR将调用自身默认的异常处理机制来处理。

二、什么是异常处理

“异常”是程序在执行时发生的错误。导致这种错误的原因来自三个方面。

(1)代码错误,包括语法错误、逻辑错误,这是由开发人员造成的。

(2)资源不可用,这是由系统访问了未经授权的资源而引起的错误。

(3)公共语言运行库,这是由CLR内部引起的错误。

异常处理就是,当我们的应用系统在运行时发生错误后,不论这种错误是由哪种原因引起的,通过开发人员对预知错误的处理或CLR内部的处理,使系统能够恢复运行的过程,如图1所示。


图1 异常处理

在.NET平台下使用异常处理,我们需要学习Exception类。

1. Exception类

Exception类为我们提供了大量的捕获、处理异常的方法。Exception类中封装的异常处理有两种,如图2所示。


图2 Exception类

(1)一种是由用户程序执行引发的异常,派生于ApplicationException类。

(2)另一种是由公共语言运行库引发的异常,派生于SystemException类。

Exception类是所有异常的基类。出现错误时,系统或当前执行的应用程序通过引发包含有关该错误信息的异常来报告错误。引发异常后,应用程序或默认异常处理程序将处理异常。Exception类包含的各种异常见下表。

Exception类说明SystemException这个类提供系统异常和应用程序异常之间的区别ArgumentException当方法提供的任意一个参数无效时,引发此异常ArithmeticException此异常表示由算术运算导致的错误DataException如果在使用ADO.NET组件时生成错误,引发此错误FormatException当参数的格式不符合被调用方法的参数规范时,引发此异常IOException当出现I/O错误时,引发此异常IndexOutOfRangeException当试图使用数组边界外的索引来访问数组的元素时,引发此异常ArgumentNullException在将空引用传递给无效参数的方法时,引发此异常DivideByZeroException当试图用某个数除以零时,引发此异常OverflowException当算术运算的结果过大而无法由目标类型表示时,引发此异常ApplicationException在应用程序执行过程中检测到由应用程序定义的异常TargetException当试图调用无效目标时,引发此异常

在异常引发后,获得异常的详细信息有助于我们查找异常的来源,并排除异常。我们如何才能获得异常的详细信息呢?我们需要掌握异常类的部分属性,见下表。WANGYEXX.COM

属性名称说明Source此属性表示导致异常发生的应用程序或对象的名称Message提供引起异常的详细信息StackTrace此属性提供在堆栈上所调用方法的详细信息,并首先显示最近调用的方法InnerException对内部异常的引用,如果此异常基于前一个异常,则内部异常指最初发生的异常

2. 如何异常处理

回顾C#基础教程《C#基础教程开发数据库应用程序》中try…catch…块的使用,以滤水器为例进一步说明。滤水器是一种捕获水中杂质的设备,以便为用户提供纯净水,滤水器中的过滤机制可以捕获到所有的杂质。同样,在try块中,我们编写可能出现异常的C#代码,一旦这些代码中出现错误,则立即转到catch块中进行处理,如果不出现问题,则跳过catch块继续执行。

在C#中我们如何得到更多的异常信息呢?使用“throw”关键字再次引发由try…catch…块捕获到异常。再次引发异常有助于我们在调试时获得更多的信息,如示例1所示。

示例1:

折叠展开C# 代码复制内容到剪贴板
  1. ///<summary>
  2. ///得到学员信息
  3. ///</summary>
  4. ///<returns></returns>
  5. public IList<Student> GetAllStudents ()
  6. {
  7.     IList<Student> studentList  new List<Student>();
  8.     try
  9.     {
  10.         studentList studentService.GetAllStudents();
  11.     }
  12.     //捕获异常
  13.     catch (Exception ex)
  14.     {
  15.     //再次引发异常
  16.         throw new Exception(ex.ToString());
  17.     }
  18.     return st.udentList;
  19. }

经验:不要用太多的异常处理,同时要尽量避免使用套嵌异常处理,因为异常处理使用不合理会使系统的性能下降。

#程序异常
0 0
原创粉丝点击