欢迎来到天天文库
浏览记录
ID:4137012
大小:371.40 KB
页数:14页
时间:2017-11-29
《第7章 处理异常和错误》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、·142·第7章处理异常和错误异常是指应用程序运行时遇到的错误或程序意外的行为。如,在运算中除以0的操作,调用代码或程序代码中有错误,操作系统资源不可用等等。异常处理则是在应用程序发生异常情况时,采取什么样的操作,是继续程序的执行,还是中断用户的操作。为了捕捉和处理异常,C#提供了3个关键字:try、catch和finally。try后面紧跟需要执行的代码块,这称为一个try块。catch捕捉try代码块中可能发生的异常,并调用合适的异常处理器进行异常的处理,称之为catch块,finally是不管异常是否被处理都必须执行的代码块,称为f
2、inally块。一个典型的异常处理结构为:try{//try块//在这一区块中放置需要被执行的程序代码。}catch(exceptionex){//catch块//exception表示异常处理器,可以为系统缺省的异常处理器,也可以是用户自定义的异常处理器}catch(customexceptionex){//catch块//exception表示异常处理器,可以为系统缺省的异常处理器,也可以是用户自定义的异常处理器}finally{//finally块//它在每次块退出时都执行,不论退出是由正常控制流引起的还是由未处理的异常引起的。}7
3、.1try/catch块在开发应用程序时,可以假定任何代码块都可能引发异常,特别是CLR运行库本身可能引发异常。比如OutOfMemoryException、StackOverflowExcpetion异常。在一些情况下,可能会使用if语句检测可能会引发异常的条件。比如一个除法运算,在执行前检测被除数是否为一个不是0的数值,如果是则提示用户除法运算失败。如下面所示的示例代码。staticvoidMain(string[]args){inti=division(100,3);if(i>0){Console.WriteLine("除法运算成功
4、,结果为{0}",i);142·143·}else{Console.WriteLine("除法运算失败!");}Console.ReadLine();}staticintdivision(intx,inty){if(y==0){return-1;}else{decimald=x/y;return(int)d;}}在上面的代码中,程序使用if语句对被除数进行了检查。这看起来似乎工作得很好,但是如果需要对除数与被除数进行更多的控制,就不得不在代码中使用大理的if语句进行判断。而且,难免会有疏漏。并且,应用程序错误必须在运行时才能发现,这对于应
5、用程序逻辑错误将会难以调试和处理。使用try/catch块,能够有效的避免if语句块的不足,通过将可能会产生异常的代码放置于try块中,在catch块中追踪可能会产生的异常,还可以在catch块中捕捉应用程序的全局异常。并且.NET对于异常处理提供了编译时支持,因此使用try/catch块是比较好的选择。如果使用异常处理方式,如下面的示例所示。staticvoidMain(string[]args){inti=division(100,0);Console.ReadLine();}staticintdivision(intx,inty){
6、try{return(int)x/y;}catch(DivideByZeroExceptionex){thrownewException("除法运算发生了一个错误!"+Environment.NewLine+ex.Message);}catch(Exceptionex){thrownewException("除法运算发生了一个错误!");}}上面的示例代码中,通过使用try/catch语句块,封装了在运行除法运算中可能会引发的错误,如果在为被除数赋一个0值,在编译时将会编译不过,debug模式下Visualstudio2005将会产生如图
7、7.1所示143·144·的错误。如果直接运行程序,在控制台窗口将会产生如图7.2所示的输出。图7.1编译时捕捉到异常,弹出一个Exception窗口图7.2运行时捕捉到异常示例程序中,通过在try块定义要执行的语句。在catch块中捕捉可能出现的异常,并使用throw语句显示抛出了一个异常。在示例程序中,定义了两个catch块。在.NET中,可以定义多个catch块,但只能有一个try块。示例代码的第一个catch块中,使用了DivideByZeroException异常。这个异常是一个具体异常。他所代表的就是被0除的错误,第二个cat
8、ch块中的异常类通常称为基类异常,该异常具有比第一个异常更粗的粒度,在这个示例中是Exception类型,Exception类型是所有异常类的基类。7.2finally块不论是否捕捉到异常,f
此文档下载收益归作者所有