C#教学课件Chap7市公开课获奖课件省名师优质课赛课一等奖课件_第1页
C#教学课件Chap7市公开课获奖课件省名师优质课赛课一等奖课件_第2页
C#教学课件Chap7市公开课获奖课件省名师优质课赛课一等奖课件_第3页
C#教学课件Chap7市公开课获奖课件省名师优质课赛课一等奖课件_第4页
C#教学课件Chap7市公开课获奖课件省名师优质课赛课一等奖课件_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

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

文档简介

第七章

错误调试和异常处理

1/55在程序设计中不可防止地出现各种各样错误,能够采取两类方法加以处理:使用C#调试工具找出其中错误并加以更正,尽可能使程序正确;在程序中加入异常处理语句,使程序含有容错功效2/55本章主要内容错误分类程序调试异常处理3/55在C#程序设计中错误分成以下两类:7.1错误分类语法错误运行错误4/55在C#程序设计中错误分成以下两类:7.1错误分类语法错误运行错误5/557.1错误分类语法错误也称为编译错误,是因为不正确地编写代码而产生。6/557.1错误分类7/557.1错误分类语法错误也称为编译错误,是因为不正确地编写代码而产生。8/55在C#程序设计中错误分成以下两类:7.1错误分类语法错误运行错误9/55在C#项目运行期间,当一个语句试图执行一个不能执行操作时,就会发生运行错误。如数据溢出、数组下标越界等。7.1错误分类10/557.1错误分类11/557.1错误分类12/557.1错误分类13/557.1错误分类另外还有一个运行错误,从语法上看,全部程序代码都是有效,但运行结果不正确,这一类错苏属算法设计错误,是最难纠正,必须使用C#调试工具进行错误排查。14/557.2程序调试C#提供了强大程序调试功效,使用其调试环境能够有效地完成程序调试,从而有利于发觉运行错误。调试工具“调试”工具栏

“调试”菜单15/557.2程序调试C#提供了强大程序调试功效,使用其调试环境能够有效地完成程序调试,从而有利于发觉运行错误。选择“试图”“工具栏”“调试”菜单命令,在工具栏中出现“调试”工具栏16/557.2程序调试“调试”菜单17/557.2程序调试1.开始调试“开启调试”命令:运行到断点。“逐语句”/“逐过程”命令:开启并执行,在第一行中止。“运行到光标处”命令:开启并运行到断点或光标位置。18/557.2程序调试2.设置断点方法一:用鼠标右键单击某代码行,从出现快捷菜单中选择“断点”“插入断点”命令(设置断点)或者“断点”“删除断点”(取消断点)。方法二:将光标移至需要设置断点语句处,按F9键。方法三:直接用鼠标单击下列图中灰色区域,即可在对应行设置断点。19/557.2程序调试20/557.2程序调试3.定位错误当某行代码出现错误时,该错误会自动添加到“错误列表”和“输出”窗口中,能够使用“错误列表”或“输出”窗口来查找代码中错误。操作:双击“错误列表”或“输出”窗口中项,则光标自动跳到代码编辑中中对应犯错行。C#语言中或在编码错误下显示一条波浪线,将鼠标悬停在带有波浪线标识代码上可显示一条消息,其中对错误进行了描述。21/557.2程序调试4.调试过程先在某行设置断点,然后在调试器中按F5键运行应用程序,应用程序会在该行停顿,此时能够检验任何给定变量值,或观察执行跳出循环时间和方式,按F10或F11逐行单步执行代码。22/557.2程序调试在C#程序中止情况下,能够将鼠标放在希望观察执行过语句变量上面,调试器就会自动显示执行到断点时该变量值,也能够在某个对象上单击鼠标右键,从弹出快捷菜单中选择“快速监视“命令,即可观察到对象中各个元素值。5.显示调试信息23/557.2程序调试5.显示调试信息24/557.3异常处理异常也是错误一个,它结果是造成程序不能正确运行。如系统瓦解、程序非正常退出、死循环等。异常发生原因可能是代码本身问题,也可能是外部环境问题,如用户误操作、操作系统错误、内存资源不足、硬件故障、无法连接网络或数据库等。异常发生时,假如没有给定异常处理程序,则程序将停顿运行,并显示一条错误信息。通常对异常处理方法有两种:25/557.3异常处理异常处理方式使用代码检验(if-else)

设置异常处理语句(try-catch)

26/557.3异常处理异常处理方式之一使用代码检验(if-else)

staticvoidMain(){Console.Write("请输入整数x:");

intx=int.Parse(Console.ReadLine());Console.Write("请输入整数y:");

inty=int.Parse(Console.ReadLine());

intresult=30/(x-2)/(y-x)/(5-y);Console.WriteLine("30/(x-2)/(y-x)/(5-y)={0}",result);}引例:计算表示式值:30(x-2)(y-x)(5-y)Chap7/P7_1该程序可能出现未处理输入字符串格式异常和除数为0异常27/557.3异常处理28/55staticvoidMain(){Console.Write("请输入整数x:");

intx=int.Parse(Console.ReadLine());if(x==2)Console.WriteLine("x值不能为2");else{Console.Write("请输入整数y:");

inty=int.Parse(Console.ReadLine());if(y==x)Console.WriteLine("x和y值不能相等");else{if(y==5)Console.WriteLine("y值不能为5");else{

intresult=30/(x-2)/(y-x)/(5-y);Console.WriteLine("30/(x-2)/(y-x)/(5-y)={0}",result);}}}}该程序中使用if语句检验除数为0异常。Chap7/P7_229/55程序中可能出现输入字符串格式异常2条语句:intx=int.Parse(Console.ReadLine());inty=int.Parse(Console.ReadLine());可采取以下语句代替进行异常检验:

Chap7/P7_2intx;while(!int.TryParse(Console.ReadLine(),outx))Console.WriteLine(“输入字符串格式错误,请重新输入x值!”);inty;while(!int.TryParse(Console.ReadLine(),outy))Console.WriteLine(“输入字符串格式错误,请重新输入y值!”);30/557.3异常处理异常处理方式之二设置异常处理语句(try-catch)

staticvoidMain(){

try{Console.Write("请输入整数x:");

intx=int.Parse(Console.ReadLine());Console.Write("请输入整数y:");

inty=int.Parse(Console.ReadLine());

intresult=30/(x-2)/(y-x)/(5-y);Console.WriteLine("30/(x-2)/(y-x)/(5-y)={0}",result);

}

catch{Console.WriteLine("程序发生异常,请检验您输入是否有误。");

}}Chap7/P7_3将可能出现异常语句置于try语句块中将出现异常后处理语句置于catch语句块中31/557.3异常处理C#中提供了4个关键字,try、catch、finally和throw来管理异常处理。try:用于执行可能造成异常操作;catch:用于定义异常处理程序;finally:用于在引发异常时释放资源;throw:用于显式引发异常。32/55C#中异常处理结构try…catch语句:用于捕捉可能出现异常,其使用语法格式以下:

try{//可能产生异常程序代码}catch(异常类型1异常对象1){//处理异常类型1异常控制代码}……catch(异常类型n异常对象n){//处理异常类型n异常控制代码}33/55C#中异常处理结构try…catch语句程序发生异常后,控制权转到catch语句(捕捉异常)catch语句只能捕捉与之配套try代码段中发生异常catch语句能够捕捉指定异常,可有多个,注意次序

try{

//程序代码}catch{

//处理异常代码}//后续语句try{

//程序代码}catch{

//处理异常代码}//后续语句Chap7/P7_434/55C#中异常处理结构try-catch-finally语句可用一个或多个catch语句finally语句在全部catch语句后,且只能出现一次不论是否发生异常,finally语句总是被执行(清理异常)

finally语句含有很高优先级finally代码段中不允许使用return语句Chap7/P7_635/55staticvoidMain(string[]args){intresult=0;intcount=0;Console.WriteLine("请依次输入5个整数:");for(inti=0;i<5;i++){

result+=int.Parse(Console.ReadLine());count++;

}

Console.WriteLine(“您输入次数共为{0}次,错误次数为{1}次”,count,count-5);Console.WriteLine(“求和结果为:{0}”,

result);Console.ReadLine();}Chap7/P7_6计算从控制台输入5个整数和,输出求和结果、输入总次数以及错误次数该语句可能出现输入字符串格式异常36/55

staticvoidMain(string[]args){intresult=0;intcount=0;

Console.WriteLine("请依次输入5个整数:");for(inti=0;i<5;i++){

}

Console.WriteLine(“您输入次数共为{0}次,错误次数为{1}次”,count,count-5);

Console.WriteLine("求和结果为{0}:",result);Console.ReadLine();}Chap7/P7_6计算从控制台输入5个整数和,输出求和结果、输入总次数以及错误次数try{result+=int.Parse(Console.ReadLine());}将可能出现异常语句置于try语句块中catch(FormatException){Console.WriteLine("输入不正确,请重新输入:");i--;continue;}将出现异常后处理语句置于catch语句块中37/55

staticvoidMain(string[]args){intresult=0;intcount=0;

Console.WriteLine("请依次输入5个整数:");for(inti=0;i<5;i++){

}

Console.WriteLine(“您输入次数共为{0}次,错误次数为{1}次”,count,count-5);

Console.WriteLine("求和结果为{0}:",result);Console.ReadLine();}Chap7/P7_6L2_4_1\L2_4\L2_4_2计算从控制台输入5个整数和,输出求和结果、输入总次数以及错误次数try{result+=int.Parse(Console.ReadLine());}将可能出现异常语句置于try语句块中catch(FormatException){Console.WriteLine("输入不正确,请重新输入:");i--;continue;}将出现异常后处理语句置于catch语句块中finally{count++;}将清理工作语句置于finally语句块中38/55C#中异常处理结构try-finally语句不对异常进行处理,利用finally收尾假如try代码段中发生异常,该异常在执行完finally语句后被抛出。39/55throw语句:显式抛出异常用于对发生异常进行描述throw后跟一个异常类型对象

throw语句有两种使用方式:(1)直接抛出异常;(2)在出现异常时,经过含有catch块对其进行处理并使用throw语句重新把这个异常抛出并让调用方法程序进行捕捉和处理。throw语句使用语法格式以下:throw[表示式];其中表示式类型必须是System.Exception或从System.Exception派生类类型Chap7/P7_740/55Demo1、Chap7/P7_7classProgram{staticvoidMain(string[]args){try{fun();}catch(Exceptionerr){Console.WriteLine("Main:{0}",err.Message);}}staticvoidfun(){intx=5,y=0;try{x=x/y;}catch(Exceptionerr){Console.WriteLine("fun:{0}",err.Message);

throw;}}}不带表示式throw语句只能用在catch块中,它重新抛出当前正在由catch块处理异常41/55异常层次结构try{…}catch(Exception){…}catch(SystemException){…}catch(ArgumentException){…}catch(ArgumentNullException){…}

ExceptionSystemExceptionArgumentExceptionArgumentNullException42/55异常传输当异常在try代码段中被引发时,程序控制权将在异常处理结构中转移,直至找到一个能够处理该异常catch语句,这个过程称为“异常传输”。异常传输步骤:(1)假如当前异常处理结构中包含能够处理该异常catch语句,则程序控制权就转移给第一个这么catch语句,异常传输结束。(2)假如没有找到能够处理该异常catch语句,则程序经过当前异常处理结构(假如存在finally代码段则执行它)(3)假如程序抵达更外层一个异常处理结构,则转到第(1)步。(4)假如异常在当前组员方法中没有得处处理,则当前方法执行代码被终止;若当前方法是程序所在进程或线程主方法,则整个程序结束运行;不然,程序控制权转移给调用当前方法代码,重复第(1)步。举例1:Chap7/P7_843/55举例1:Chap7/P7_8staticvoidMain(string[]args){try{

OutterMethod(0);OutterMethod(1);OutterMethod(2);}catch(Exception){Console.WriteLine("发生普通异常");}}publicstaticvoidOutterMethod(intx){if(x==2)thrownewException();

try{MiddleMethod(x);}catch(ArithmeticException){Console.WriteLine("发生算术异常");}}publicstaticvoidMiddleMethod(intx){if(x==1)thrownewArithmeticException();

try{InnerMethod(x);}catch(DivideByZeroException){Console.WriteLine("发生除法异常");}}publicstaticvoidInnerMethod(intx){if(x==0)thrownewDivideByZeroException();}44/55

异常传输举例2:下面代码段最终引发异常有哪些?

try

{try{thrownewFormatException();}catch{thrownewArgumentNullException();}

}catch

{try{thrownewOverflowException();}finally{thrownewNullReferenceException();}

}finally

{try{thrownewArgumentOutOfRangeException();}catch{thrownewApplicationException();}

}45/55

异常传输举例3:下面循环一共会被执行几次?

i=0;while(i<10){

try{thrownewOverflowException();}catch(ArgumentException){i+=2;}catch(ArithmeticException){i+=4;}catch(Exception){i+=6;}finally{i--;}}7.3异常处理46/55惯用异常类Exception:全部异常类基类Chap7/lx2惯用结构函数形式:(1)publicException()如:thrownewException();(2)publicException(stringmessage)

如:thrownewException(“文件打开抛出异常”);

捕捉这个结构函数错误消息需要使用Exception类Me

温馨提示

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

评论

0/150

提交评论