VisualC#.NET编程技术王强Email:blestwq@263.net中科院计算所计算机职业技能培训中心第五讲C#的异常处理本讲的主要内容:异常处理机制异常处理方法自定义异常处理异常:程序在运行过程中所发生的错误事件(如数组越界、文件操作时未找到文件、除法溢出等)而这些错误在设计时不能准确地识别出但又可能会发生或者不会发生。特点:必须是程序在执行过程中所产生的错误。它可能产生也可能不产生,具体取决于当时的执行环境。一旦产生出该错误,将导致运行阶段环境终止及程序流程发生改变。程序设计中的几种类型的错误编译错误(语法错误);运行时错误(在运行过程中所发生的错误)不可预料的逻辑错误(设计不当所造成的,并且有较强的隐蔽性)可预料的运行异常(它是由系统的运行环境所造成的)。异常处理的优点(OOP方式的错误处理编程)能将“错误处理”代码与“常规功能”代码相分离;能将错误沿调用栈向上传播;能按错误类型和错误对象分组,分门别类地加以处理。允许类似于SwitchCase语句的分类过滤错误例外非结构化错误处理的缺点代码很难阅读、调试和维护容易忽视错误C#的异常处理机制主要体现在“抛出异常”并“捕获异常”这两个层次。(1)抛出异常:当程序执行过程中产生异常时,运行系统将抛出异常类对象(它代表某一异常类型的错误事件,为System.Exception类或其子类的对象。)。(2)捕获异常:用户程序或运行系统可以捕获该异常类对象(在函数的调用栈中查找能处理此异常事件的程序为止)并相应地给出处理的方法(代码)。如何捕获异常:采用try,catch,finally语句块try语句块:它指定可能会产生异常的语句范围,也即为catch规定异常捕获的语句范围。编程格式如下:try{可能会产生异常的语句块;}catch语句块:它指明需要捕获异常事件的类型并针对该类型的异常所对应的处理方法(代码)。C#中的catch编程格式可以为如下的某一种(其中第一种格式由于有异常参数,这样能获得引发异常时的信息)。格式一:catch(异常事件的类型对象名){//并相应地给出处理的方法(代码);}格式二:catch(异常事件类的类型){//注意该类必须为Syste.Exception类或其子类//并相应地给出处理的方法(代码);}格式三:catch{//并相应地给出处理的方法(代码);}在不能确定会发生异常类型的情况下采用它多catch语句块编程时的要点应从特殊到一般进行匹配(先将特殊类型的异常事件放在前面,再一般类型的异常事件)try与catch之间不能有其他语句(不能被隔断)。如:try{}intx=1;//错误,不能被隔断catch(Exceptione){}finally:它指定一代码块,不管是否有异常产生或是否捕获住该异常,程序都从此处继续向后执行。从而达到提供统一的出口(如在其中实现关闭文件、清除系统资源等)。示例:usingSystem;classTestApp{staticintzero=0;publicstaticvoidMain(){try//划定程序出所可能产生的异常范围{inta=100/zero;Console.WriteLine(a={0},a);//产生异常时将不会执行该语句}//以下捕获程序中所可能产生的各种异常,但遵守从特殊到一般匹配原则catch(DivideByZeroExceptione){Console.WriteLine(OverflowException:+e.Message);}catch(Exceptione)//利用e.Message()获得异常产生时的信息内容{Console.WriteLine(ThereisanException:+e.Message);}catch//注意该种catch语句{Console.WriteLine(ThereisanException);}Console.WriteLine(AfterexceptionHandling!);}}异常捕获的几种方式try-catch组合:利用这种组合可以实现捕获和处理异常。注意:在C#中允许既没有定义异常类型又没有定义异常对象变量的catch语句。它通常是在不能取得确定会发生的异常类型的情况下用的。但一条try语句后只能有一条这样的catch语句并且只能排在其它的catch语句之后。try-finally组合:利用这种组合可以实现无论try语句中是否产生异常,finally中的语句都要执行以保证能完成异常的清理工作。try-catch-finally组合:利用这种组合可以实现当try语句中产生异常时先执行catch中的异常处理的代码然后再执行finally中的语句。如果没有产生异常,也要执行finally中的语句。异常的抛出抛出的方式系统自动抛出的异常:程序中出现系统中定义的异常时,可以由系统自动来抛出它使用“throw异常事件(对象名)”来抛出该种类型的异常事件,以便上一级的调用者来捕获并处理它。系统中预定义的异常类:在System命名空间中定义出了大量的常用的异常类,如:ArgumentExceptionDivideByZeroExceptionIndexOutOfRangeException等System.Exception类提供关于异常的信息,此类是所有异常的基类。Exception包含下列属性,它们可以帮助标识异常的代码位置、类型、帮助文件和原因:StackTrace:获取当前异常发生时调用堆栈上的帧的字符串表示形式(它描述调用堆栈的内容,其中首先显示最近的方法调用)。Message:解释异常原因的错误信息或空字符串()。HelpLink:获取或设置指向此异常所关联帮助文件的链接。Source:获取或设置导致错误的应用程序或对象的名称。TargetSite:获取引发当前异常的方法。声明自己的异常类编程要求:①从System名字空间中的某一系统异常类(如Exception类)来派生;异常类的名称应以“Exception”结尾。②声明自己的异常类的成员数据或成员方法,以反映用户自定义的错误信息。同时也可以更准确地对用户的异常行为作出相应的处理。编程要点:声明自己的异常类主要目的是为应用程序中特定错误提供相应的错误提示信息。因为在有些应用场合下不便采用标准的错误信息同时也可扩充C#系统中的异常类以满足用户的特定的应用需要。实例:demo.异常处理本单元的回顾