第5章 异常处理ppt课件_第1页
第5章 异常处理ppt课件_第2页
第5章 异常处理ppt课件_第3页
第5章 异常处理ppt课件_第4页
第5章 异常处理ppt课件_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

,第5章异常处理,5.1一个产生异常的简单程序5.2异常的捕获与处理,本章内容,5.1一个产生异常的简单程序,创建控制台应用程序ExceptionPro,该程序能够捕获产生的异常,并进行相应的处理:staticvoidMain(stringargs)intn,m;strings=Console.ReadLine();n=0;trym=Convert.ToInt16(s);/产生异常的语句Console.WriteLine(m=0,m);catch(Exceptione)/捕获异常Console.WriteLine(产生异常:0,e.Message);/处理异常Console.ReadKey();,试图将“123ab4”转换为整数时产生了异常,产生该异常时自动转向执行该语句,5.1一个产生异常的简单程序,说明:可能出现异常的代码放在try块中处理异常的代码则放在catch块中当程序在运行过程中产生异常时,则会转向执行catch块中的代码,从而避免因异常的产生而导致程序运行的非正常终止。,作用:使程序具有较强的错误处理能力,使得程序更加健壮和稳定。,5.2异常的捕获与处理,5.2.1异常的概念所谓异常,它是指程序在运行过程(而非编译过程)中产生的错误编译过程中的错误可以通过代码调试来避免,异常一般是不能避免的(只能是减少),5.2异常的捕获与处理,5.2.2try-catch结构try-catch结构:try/可能产生异常的代码catch(异常类对象名)/处理异常的代码,说明:(1)一旦在try块中有某一条语句执行时产生异常,程序立即转向执行catch块中的代码,而不会再执行该语句后面的其他语句。当然,如果try块中的语句都不产生异常,那么就不会有任何的catch块被执行。,说明:(2)“(异常类对象名)”部分可以省略。如果省略这部分,则不管在try块中产生什么异常,程序都会转向执行catch块中的代码,但在这种情况下我们无法获取此异常的任何信息。,说明:(3)“异常类”用于决定要捕获的异常的类型,不同的异常类能捕获和处理不同的异常,常用的异常类如表5.1所示,5.2异常的捕获与处理,5.2.2try-catch结构,【例5.1】内存溢出异常的捕获和处理。在申请较大块的存储空间时可能出现失败,这时会产生一个内存溢出的异常(OutOfMemoryException),根据这个异常我们就可以决定下一步要采取什么样的动作。在下面的OutOfMemExc_Exa程序中,申请了20000*30000个存储单元,结果超出了笔者机器的可用内存空间,因而产生了内存溢出异常。,5.2异常的捕获与处理,5.2.2try-catch结构,【例5.1】内存溢出异常的捕获和处理。staticvoidMain(stringargs)tryint,a=newint20000,30000;/申请存储空间catch(OutOfMemoryExceptione)/异常捕获与处理Console.WriteLine(产生异常:0,e.Message);Console.ReadKey();,5.2异常的捕获与处理,5.2.3try-catch-catch结构,当出现的多个不同的异常,需要用到带多个catch块的try-catch-catch结构。【例5.2】多个异常的捕获和处理。程序中,try结构包含的两条语句在执行时都会产生异常,分别为DivideByZeroException异常和OutOfMemoryException异常。这两个异常分别由两个catch结构来捕获和处理。,5.2异常的捕获与处理,5.2.3try-catch-catch结构,staticvoidMain(stringargs)intn,m;n=30000;m=30000;tryn=1/(n-m);int,a=newintn,n;catch(OutOfMemoryExceptione1)Console.WriteLine(内存溢出异常:0,e1.Message);catch(DivideByZeroExceptione2)Console.WriteLine(零除异常:0,e2.Message);,由于DivideByZeroException异常先发生,故转向执行第二个catch块,第一个catch块没有被执行。,5.2异常的捕获与处理,5.2.3try-catch-catch结构,多个catch块在出现顺序上有何要求呢?这要分两种情况来讨论:(1)catch后面的异常类之间没有继承关系(如DivideByZeroException和System.OutOfMemoryException),这时catch块的位置不分先后,即在前、在后都不影响程序的运行结果。例如,上例中的catch结构就属于这种情况。(2)catch后面的异常类之间存在继承关系(如DivideByZeroException类继承了ArithmeticException类、所有异常类都继承了Exception类),这时派生类所在的catch块必须放在基类所在的catch块的前面。即作用范围小的catch块放在前面,作用范围大的块放在后面。,5.2异常的捕获与处理,5.2.3try-catch-catch结构,例如,下面代码中的两个catch块的顺序是不能颠倒的,否则无法通过编译检查:intn=1,m=1;tryn=1/(n-m);catch(DivideByZeroExceptione)/派生类所在的catch块(作用范围小)Console.WriteLine(产生异常:0,e.Message);catch(ArithmeticExceptionee)/基类所在catch块(作用范围大)Console.WriteLine(产生异常:0,ee.Message);,互换?,5.2异常的捕获与处理,5.2.3try-catch-catch结构,由于Exception类是所有其他异常类的基类,因此Exception类所在的catch块必须是最后面的catch块,它可以捕获任意类型的异常。,显然,如果不想具体区分是哪一种类型的异常,也不想利用Exception派生类更强大、更具针对性的处理能力,我们可以利用Exception类“笼统”地捕获所有的异常。这使代码变得简洁,保证所有的异常都能被捕获,而不会出现遗漏。,5.2异常的捕获与处理,5.2.4try-catch-finally结构,为什么要用finally块?程序在运行过程中一旦出现异常会立即转向执行相应catch块中的语句,执行完后接着执行try-catch结构后面的语句。这意味着在出现异常时程序并不是按照既定的顺序执行,而是跳转执行。为维持系统的有效性和稳定性,必须保证有相应的代码能够“弥补”被跨越代码的工作,主要是完成必要的清理工作(如关闭文件、释放内存等)。这种保证机制可以由带finally的try-catch-finally结构来实现。,5.2异常的捕获与处理,5.2.4try-catch-finally结构,try-catch-finally结构的格式如下:try/可能产生异常的代码catch(异常类对象名)/处理异常的代码finally/完成清理工作的代码,说明:根据需要,可以在这种结构中带1个或多个catch块。不管在try块中是否产生异常,finally块中的代码都会被执行。也就是说,不管catch块是否被执行,finally块都会被执行。哪怕是在执行catch块中遇到return语句,也会执行finally块中的语句。,5.2异常的捕获与处理,5.2.4try-catch-finally结构,例如:intn=1,m=1;tryn=1/(n-m);catch(Exceptione)Console.WriteLine(产生异常:0,e.Message);return;Console.WriteLine(紧跟在return后面.);finallyConsole.WriteLine(finally块.);Console.WriteLine(try-catch-finally结构后面的部分.);,产生零除异常,执行catch块,遇到return语句,该语句不被执行,该语句被执行,该语句不被执行,因在catch块中遇到return语句,可以看到,虽然catch块包含了一条return语句,且执行该return语句时也会立即结束当前函数的执行,但在结束之前仍然会执行finally块。这说明,只要程序进入try-catch-finally结构,都会执行finally块。,5.3异常的抛出及自定义异常,抛出异常有两种方式:一种是将捕获的异常原封不动地直接抛出;另一种是先利用捕获的异常来创建新的异常(在创建过程中可以进行一些必要的处理),然后将新建的异常抛出。除了系统提供的异常类以外,用户也可以通过继承已有的相关异常类来定义新的、满足特定需要的异常类,这就是用户自定义异常。,5.3异常的抛出及自定义异常,5.3.1抛出异常,抛出异常有两种方式。一种是直接抛出,也称为异常重发,格式如下:throwe;/e为已捕获的异常的名称另一种是先利用捕获的异常来创建新的异常,然后将之抛出,格式如下:thrownew异常类名(参数列表);当然,也可以写成:异常类名异常对象名=new异常类名(参数列表);throw异常对象名;,5.3异常的抛出及自定义异常,5.3.1抛出异常,【例5.3】抛出异常的例子。考虑下面有关抛出异常的ThrowtException程序:classtestExceptionintn,m;publicvoidg()n=10;m=10;tryn=1/(n-m);catch(Exceptione)thrownewException(这是在方法g()产生的异常:+e.Message,e);/throwe;/异常重发,在方法g()中捕获一个零除异常,并利用该异常的Message属性值以及该异常本身作为参数来创建一个新的异常并将之抛出,5.3异常的抛出及自定义异常,5.3.2用户自定义异常,系统提供的异常类也许不能很好地满足我们的需要,这时程序员可以根据需要定义自己的异常类,但定义的异常类必须继承已有的异常类。【例5.4】定义和使用用户自定义异常。设计思想:在程序MyExceptionClass中先定义了一个学生类student类,该类包含两个私有变量成员:name和score,分别表示学生姓名和成绩,且name的长度不超过8个字节,score的范围为0,100;另外还包含一个方法成员f(),用于设置name和score。然后自定义一个异常类UserException,当对name所赋的值的长度超过8个字节或者对score所赋的值不在0,100范围内时都抛出此自定义异常。关键代码如下:,5.3异常的抛出及自定义异常,5.3.2用户自定义异常,关键代码如下:classUserException:Exception/定义用户的异常类/重载Exception类的构造函数publicUserException()publicUserException(stringms):base(ms)publicUserException(stringms,Exceptioninner):base(ms,inner),5.3异常的抛出及自定义异常,5.3.2用户自定义异常,classstudent/定义学生类privatestringname;/姓名,长度不超过8个字节privatedoublescore;/成绩,范围为0,100publicvoidsetInfo(stringname,doublescore)if(name.Length8)throw(newUserException(姓名长度超过了8个字节!);if(score100)throw(newUserException(非法的分数!);=name;this.score=score;,5.3异常的抛出

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论