C#程序设计主讲教师:杨剑1项目8:程序调试与异常处理——优化图片浏览器一、教学内容及要求能力培养:1、了解程序错误的3种类型。2、熟练运用VisualStudio.Net2010的调试器调试程序错误。3、了解异常和异常处理的概念。4、学会使用try-catch-finally及throw语句来捕获和处理异常。。核心技能点:1、调试程序错误的方法。2、try-catch-finally结构及其使用方法。教学内容:1、项目介绍。任务1:优化图片浏览器,实现异常处理(5分钟)2、案例演示:项目调试任务2:熟练运用VisualStudio.Net2010的调试器调试程序错误。(15分钟)如:实践,利用VisualStudio.Net2010的调试器调试程序错误。3、案例演示:程序的异常处理任务4:使用try-catch-finally语句来捕获和处理异常。(35分钟)如:实践,阶乘功能的异常处理。4、项目实现:任务5:优化图片浏览器,实现异常处理(20分钟)5、案例演示:使用自定义异常任务8:熟练使用自定义异常。(15分钟)如:建立自定义异常,实现邮件格式的检查。6、课内实践:任务9:熟练掌握VisualStudio.Net2010的调试器的使用方法和C#的try-catch、finally和throw语句的使用方法。(45分钟)如:设计一个Windows应用程序,在一个文本框中输入n个数字,中间用逗号作间隔,然后编程对排序并输出。二、教学重点、难点及解决办法教学重点:1、调试程序2、异常的处理方法教学难点:C#程序设计主讲教师:杨剑2异常处理教学方法:基于CDIO的课程改革,应用了CDIO教育模式。以“做中学”为出发点,实施“知识讲解案例化、课内课外协作化、实战演练一体化”的教学模式。由传统的教师引导课堂转变为以学生为主体,课本中的知识点讲解转变为“项目”主导,将传统的课堂模式转变为了以实际经验为核心。三、教学设计1、教学进程工程化将教学内容按CDIO理念,以项目为核心,并结合课程内容设计了四个环节的内容,包括构思环节、设计环节、实现环节、运作环节,同时,在课程的教学过程中,主要采用“做中学”的教学理念来实现“教学做”一体化。以项目为载体,将抽象的知识融入到项目中,通过项目的学习将知识点分解,将“工程”教学思想体现在教学中,进而提高学生的学习效果。2、教学设计递进化根据“工程化”的思想,教学模式的设计呈递进化趋势,每一个教学项目的实现将分成四个部分来完成:任务的明确,实施方案的编写,项目的实施和项目的评价3、实践设计层次化在项目的实施过程中,主要组织层次化教学。在教学中,采取“基础实验”“综合实验”,“综合性课程设计”的设计。4、课程考核工程化考核以过程考核和工程验收测试相结合的方式进行。本门课程采取的是形成性考核方式,考试成绩由本门课程学习期间的多项过程成绩组合而成5、知识讲解案例化根据CDIO的思想,对知识点采取案例化教学法,6、课内课外协作化7、实战演练一体化为了让学生对所学课程加深理论知识,并能够将相关知识结合到实际应用中,学生需要自选一个相关主题进行综合项目的开发,提高综合应用能力。在这个环节中,学生是主体,教师主要负责引导和监控,学生需要在这个阶段发挥自身能力,以团队的形式完成项目,并由此锻炼学生的团队合作意识。四、教学过程1、项目介绍。任务1:优化图片浏览器,实现异常处理(5分钟)C#程序设计主讲教师:杨剑3优化图片浏览器,提高健壮性2、案例演示:项目调试任务2:熟练运用VisualStudio.Net2010的调试器调试程序错误。(15分钟)(1)错误类型①语法错误:语法错误、缺少括号等;在编译时确定;易于确定②逻辑错误:错误的算法导致错误结果、公式错误等;在执行过程中确定;难以调试③运行时错误:内存泄漏、以零作除数、异常;在运行时确定;难以调试(2)调试过程——调试器①观察程序的运行时行为②跟踪变量的值③确定语义错误的位置④查看寄存器的内容⑤查看内存空间(3)VS.NET中的调试工具①“局部变量”窗口②“监视”窗口③“即时”窗口(4)VisualStudio.NET调试器的功能①跨语言调试②调试使用.NET框架编写的应用程序以及Win32本机应用程序加入正在运行的程序调试多个程序(5)实践,利用VisualStudio.Net2010的调试器调试程序错误。3、案例演示:程序的异常处理任务4:使用try-catch-finally语句来捕获和处理异常。(35分钟)(1)生活中的异常(2)什么是异常C#程序设计主讲教师:杨剑4①异常就是在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序②面对异常该怎么办呢?通常情况下,我们会这样处理:(3)什么是异常处理C#编程语言使用异常处理机制为程序提供了错误处理的能力(4)C#中如何进行异常处理C#的异常处理是通过4个关键字来实现的:try、catch、finally、throw(5)System.ExceptionC#程序设计主讲教师:杨剑5(6)引发异常:在C#程序中,引发异常共有以下两种方式①使用显式throw语句来引发异常。在此情况下,控制权将无条件转到处理异常的部分代码②使用语句或表达式在执行过程中激发了某个异常的条件,使得操作无法正常结束,从而引发异常(7)try/catch块:使用try/catch块捕获异常,分为三种情况:(8)try/catch/finally在try/catch块后加入finally块,可以确保无论是否发生异常,finally块中的代码总能被执行C#程序设计主讲教师:杨剑6(9)多重catch块①一段代码可能会引发多种类型的异常②当引发异常时,会按顺序来查看每个catch语句,并执行第一个与异常类型匹配的catch语句③执行其中的一条catch语句之后,其后的catch语句将被忽略④示例:用于捕捉两种异常的“catch”块try{//程序代码}catch(IOExceptionE){//错误处理代码}catch(OutOfMemoryExceptionE){//错误处理代码}C#程序设计主讲教师:杨剑7(10)实践,阶乘功能的异常处理。4、项目实现:任务5:优化图片浏览器,实现异常处理(20分钟)5、案例演示:使用自定义异常任务6:熟练使用自定义异常。(15分钟)(1)抛出异常如果在当前环境无法解决一个异常,就要将其抛出,把异常交给调用者处理示例:publicclassTeacher{privatestringid;//老师编号,长度应为7publicvoidsetId(stringpId){//判断老师编号的长度是否为7if(pId.Length==7)id=pId;elsethrownewIndexOutOfRangeException(参数长度应为7!);}}staticvoidMain(string[]args){Teacherteacher=newTeacher();try{teacher.setId(088);}catch(IndexOutOfRangeExceptionex){Console.WriteLine(ex.Message);}}(2)实践:建立自定义异常,实现邮件格式的检查。①建立自定义异常usingSystem;publicclassEmailErrorExcetion:ApplicationException{privatestring_message;publicEmailErrorExcetion(){//重写构造函数_message=base.Message;C#程序设计主讲教师:杨剑8}publicEmailErrorExcetion(stringmessage):base(message){_message=base.Message;}publicEmailErrorExcetion(stringmessage,System.ExceptioninnerException):base(message,innerException){_message=base.Message;}publicoverridestringMessage{//Message属性的重载get{returnEmail格式不正确。+base.Message;}}}②throw自定义异常publicclassSaveEmail{publicboolChackEmail(stringemail){string[]strSign=email.Split('@');//如果输入的Email不是被“@”字符分割成两段,则抛出Email错误异常if(strSign.Length!=2||strSign[0].Length==0||strSign[1].Length==0){thrownewEmailErrorExcetion(@符号不正确!);}else{intindex=strSign[1].IndexOf(.);//查找被“@”字符分成的两段的后一段中“.”字符的位置,没有“.”//或者“.”字符是第一个或最后一个字符,则抛出EmailErrorException异常if(index=0||index=strSign[1].Length-1){thrownewEmailErrorExcetion(.符号不正确);}}returntrue;}}6、课内实践:C#程序设计主讲教师:杨剑9任务7:熟练掌握VisualStudio.Net2010的调试器的使用方法和C#的try-catch、finally和throw语句的使用方法。(45分钟)如:设计一个Windows应用程序,在一个文本框中输入n个数字,中间用逗号作间隔,然后编程对排序并输出。核心代码如下:privatevoidbtnSort_Click(objectsender,EventArgse){string[]sources=txtSource.Text.Split(',');int[]a=newint[sources.Length];for(inti=0;isources.Length;i++){a[i]=Convert.ToInt32(sources[i]);}for(inti=1;i=a.Length;i++){for(intj=1;j=a.Length-i;j++){if(a[j-1]a[j]){intt=a[j-1];a[j-1]=a[j];a[j]=t;}}}foreach(inttina){lblShow.Text+=String.Format({0,-4:D},t);}}}五、参考资料[1]VisualC#.NET程序设计教程(第2版),罗福强,白忠建,杨剑,人民邮电出版社,2012-8[2]C#入门经典(第5版),(美)沃森,(美)内格尔等著,齐立波翻译,黄静审校,清华大学出版社,2010-12[3]精通C#(第6版),(美)特罗尔森著,姚琪琳等译,人民邮电出版社,2013-07C#程序设计主讲教师:杨剑10[4]精通C#5.0与.NET4.5高级编程——LINQ、WCF、WPF和WF,张敬普,丁士锋等编著,清华大学出版社,2014-02