资源描述
,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,C#,面向对象编程,(,五,),异常处理,berry,博客:,5.7,异常处理,异常就是程序运行中发生的错误,程序如果发生异常,我们可以进行异常处理。,C#,采用面向对象的方法来处理异常。在一个方法的运行过程中,如果发生了异常,则这个方法自动生成代表该异常的一个对象,并把它交给系统,系统寻找相应的代码来处理这个异常。生成异常对象并把它交给系统的过程称为,抛出异常,。系统在方法的调用栈中查找,从生成异常的方法开始回溯,直到找到包含异常处理的方法为止,这个过程称为,捕获一个异常,。,5.7.1,异常的概念和处理方式,在,C#,中,每个异常类都代表了一种运行错误,类中包含了该错误的信息和处理错误的方法等内容。所有的异常都表现为一个类的实例,这个类为,System.Exception,。,Exception,类有自己的方法和属性。常用的构造方法有两个:,public Exception();,public Exception(string s);,/,该方法可以接受信息,以对异常所对应的错误进行描述。,Exception,类还有两个属性,:,Message:,描述错误的可读文本,可以在创建异常时传递给构造方法,如果没有则将使用默认错误信息。,StackTrace:,发生异常时调用堆栈的状态,包括错误发生位置的堆栈跟踪、所有调用的方法和源文件中这些调用所在的行号。,系统定义的经常用到的异常,System.OutOfMemoryException,用,new,分配内存失败,System.StackOverflowException,递归过多过深,System.NullReferenceException,对象为空,Syetem.IndexOutOfRangeException,数组边界超出,System.ArithmaticException,算术操作异常的基类,System.DivideByZeroException,除零错,System.OverflowException,溢出错误,System.ArrayTypeMismatchException,数组类型不匹配,5.7.2,对异常进行处理,throw,、,try,、,catch,、,finally,1,、,throw,语句,throw,语句用于抛出异常,即发出在程序执行期间出现异常的信号,格式为,throw(,异常对象,),。,using System;,public class Test,public static void Main(),string s1=null;,if(s1=null),throw(new ArgumentNullException();,throw,语句一般放在,if,语句中,只有当条件得到满足,(,用户自己定义的错误发生,),才执行,.,异常必须是,Exception,及其子类,.,2,、,try-catch,语句,:,当,try,中的语句产生异常时,系统在,catch,子句中进行查找,看抛出的异常是否和哪个子句的异常的对象类型相同(或是派生类),如果找到了就执行该子句中的语句;如果没找到就产生一个未处理的异常错误,则运行时系统将终止。,一般格式,try,被测试语句,;,catch(,异常对象声明,1),异常处理语句,;,catch(,异常对象声明,2),异常处理语句,;,using System;,class Myclass,public static void Main(),Myclass x=new Myclass();,try,string s=null;,x.Test(s);,catch(Exception e),/*,参数可省略直接写成,catch,表示捕获任何异常*,/,Console.WriteLine(“0,被捕获”,,e);,string str=Console.ReadLine();,public void Test(string s),if(s=null),throw(new ArgumentNullException();,3,、,finally,语句:为异常提供一个统一的出口,不论,try,语句块及,catch,语句块中是否发生了异常,也不论出现任何语句(即使有,return,或,throw,),,finally,子句都会被执行。,Finally,经常用于对资源做清理工作如关闭文件等,,finally,中不允许出现,return,。,using System;,Public class Test,public static void Main(),int i=27;,string s=“susan”;,object o=s;,try,i=(int)o;,/,非法类型转换,finally,Console.WriteLine(“0”,i);,try,后面至少有一个,catch,或,finally.,异常举例,1.,public class Test,public static void Main(),string friends=“lisa”,”peter”,”tom”;,try,for(int i=0;i=5;i+),Console.WriteLine(“0”,friendsi);,catch(IndexOutOfRangeException e),Console.WriteLine(e.Message);,Console.WriteLine(“the end”);,异常举例,2.,public class Test,public static void Main(),int a=0;,try,a=int.Parse(“2”);,a/=(a-a);,catch(ArithmeticException ea),Console.WriteLine(“ea”+ea);,finally,Console.WriteLine(“the end”);,5.7.3,用户自定义异常类,用户要完成的工作:,1,、声明一个新的异常类,以,ApplicationException,类或其他某个已经存在的异常类为父类;,2,、为新的异常类定义属性和方法,或重载父类的属性和方法,使这些属性和方法能体现该类所对应的错误信息。,using System;,Class MyException:ApplicationException,private int idnumber;,public MyException(string message,int id):base(string message),this.idnumber=id;,public int getId()return idnumber;,public class Test,public static void regist(int num),if(num0),Console.WriteLine(“,登记号码“,+num);,throw(new MyException(“,号码为负值,不合理”,,3,);,public static void manager(),try regist(-100);,catch(MyException e)Console.WriteLine(“,登记失败”,+e.getId();,Console.WriteLine(“,本次登记操作结束”);,public static void Main(),Test.manager();,5.7.4,算术溢出及检查,C#,可以对溢出进行处理。,C#,默认不进行溢出检查,为了要进行溢出检查,在程序中使用关键字,checked,及,unchecked,它们可以针对一个表达式或一个语句块中所有表达式。,针对表达式:,checked(,表达式),针对语句块:,checked,在程序运行时,如果在,checked,上下文中发生了溢出,系统会抛出,System.OverflowException,异常,程序可以对该异常进行捕获,;,如果是,unchecked,则不会异常,但结果会被截断,.,using System;,public class Overtest,public static void Main(),int f=1;,string s;,int i,n;,s=Console.ReadLine();,n=Int32.Parse(s);,for(i=1;in;i+),checked f*=i;,string str=Console.ReadLine();,例,3.,public class Test,public static void Main(),byte a,b,result;,a=255;b=3;,try,unchecked,result=(byte)(a+b);,Console.WriteLine(“unchecked result”+result);,result=checked(byte)(a+b);,Console.WriteLine(“unchecked result”+result);,catch(OverflowException e),Console.WriteLine(e);,
展开阅读全文