乘除运算-异常处理.ppt
第6章 乘除运算异常处理,能力目标:1.学会使用try、catch和finally语句处理异常。2.学会使用throw从方法中抛出异常。3.学会使用checked和unchecked控制整数溢出检查。4.能运用异常处理机制编写整数、实数除法运算及乘法溢出检查应用程序。,内容介绍,6.1 项目预览6.2 异常运行时出错6.3 异常种类与层次结构6.4 异常处理代码块try-catch等6.5 使用throw语句抛出异常6.6 自定义异常类6.7 启用或禁用整数运算溢出检查checked/unchecked6.8 本章小结6.9 项目实训6:带异常处理的乘除运算,6.1 项目预览,带异常处理的整数除法、抛出除数为0异常的实数除法、整数乘法溢出检查WPF应用程序项目,运行界面:,6.2 异常运行时出错,程序没有语法错误,运行时也会出现异常(Exception)。先看一个没有异常处理的整数除零例子。【例6-1】建立控制台应用程序项目,编写整数除零代码:int x,y,z;x=2;y=0;z=x/y;Console.WriteLine(整数除以0,得:+z);,【例6-2】改进例6-1,在代码中加入异常处理代码块try-catch。,try int x,y,z;x=2;y=0;z=x/y;Console.WriteLine(整数除以0,得:+z);catch(Exception ex)Console.WriteLine(异常:+ex.Message);,6.3 异常种类与层次结构,每引发一个异常,系统就创建一个异常类的对象。异常类有多种,例如:系统预定义异常:DivideByZeroExceptionArithmeticExceptionOverflowException 等等。还可在应用程序中按需要自定义异常类。异常的祖先类(基类)是 Exception,Exception类有一个重要的Message属性(当然其他异常类也有该属性),用来提供有关异常起因的详细信息。,异常种类与层次结构,Exception直接派生出两个子类:(1)SystemException类。系统预定义的(公共语言运行库)异常基类。(2)ApplicationException类。该类的作用不大。部分异常类的层次结构:DivideByZeroException ArithmeticException SystemException ExceptionOverflowException ArithmeticException SystemException ExceptionFileFormatException FormatException SystemException ExceptionFileNotFoundException IOException SystemException Exception,6.4 异常处理代码块try-catch等,编写了异常处理块,发生异常时,控制流跳转到相关处进行处理,并按预定步骤正常运行下去。否则,程序会一触即溃。程序的健壮性与异常处理的密切相关。异常处理代码块的格式有5种:(1)带参数的try-catch try 可能发生异常代码 catch(异常类 参数)异常处理代码,异常处理代码块的格式,(2)不带参数的try-catch try 可能发生异常代码 catch 异常处理代码(3)不同异常作不同处理的try-catch-catch.try 可能发生异常代码 catch(异常类1 参数)异常处理代码1 catch(异常类2 参数)异常处理代码2.catch(异常类n 参数)异常处理代码n catch子块的排列顺序很重要,通常,最后一个catch子块总是捕获最顶层异常 Exception。,【例6-3】建立控制台应用程序项目,编写整数除法运算代码,对不同类型异常作不同处理。,try int x,y,z;Console.Write(请输入整数的被除数:);x=int.Parse(Console.ReadLine();Console.Write(请输入整数的除数:);y=int.Parse(Console.ReadLine();z=x/y;Console.WriteLine(整除结果:+z);catch(FormatException fEx)Console.WriteLine(格式异常:+fEx.Message);catch(DivideByZeroException dEx)Console.WriteLine(除数为零异常:+dEx.Message);catch(OverflowException oEx)Console.WriteLine(溢出异常:+oEx.Message);catch(Exception ex)Console.WriteLine(异常:+ex.Message);,异常处理代码块的格式,(4)不处理异常的try-finally try 可能发生异常代码 finally 最终代码(5)完整的异常处理块try-catch-finally try 可能发生异常代码 catch(异常类1 参数)异常处理代码1 catch(异常类2 参数)异常处理代码2.catch(异常类n 参数)异常处理代码n finally 最终代码,【例6-4】在例6-3代码后面,增加finally子代码块,使之形成try-catch-finally结构,finally Console.WriteLine(程序结束!);每次运行,不管是否发生异常,都执行finally子块语句:,6.5 使用throw语句抛出异常,除了系统自动引发,还可在应用程序中主动抛出异常:throw new 异常类构造函数名(参数列表);【例6-5】编写实数除法运算的程序:try double x,y,z;Console.Write(请输入实数的被除数:);x=double.Parse(Console.ReadLine();Console.Write(请输入实数的除数:);y=double.Parse(Console.ReadLine();z=x/y;Console.WriteLine(相除结果:+z);catch(Exception e)Console.WriteLine(异常:+e.Message);,【例6-6】编写实数除法运算的程序,要抛出“除数为零没有意义”异常。,double数据除法运算允许除数为零,不会引发异常的。但除数为零没有意义。为了与数学上的思维一致,改写例6-5代码:try double x,y,z;Console.Write(请输入实数的被除数:);x=double.Parse(Console.ReadLine();Console.Write(请输入实数的除数:);y=double.Parse(Console.ReadLine();if(y!=0)z=x/y;else throw new DivideByZeroException(除数为零没有意义);Console.WriteLine(相除结果:+z);catch(Exception e)Console.WriteLine(异常:+e.Message);,6.6 自定义异常类,自定义异常类要继承异常基类 Exception。【例6-7】创建控制台应用程序项目,编写关于“除数为零没有意义”的自定义异常类,并在实数除法运算中,遇到除数为零,就抛出该异常。编写自定义异常类:class MyException:Exception public MyException(string message):base(message),编写Program类的Main方法:,class Program static void Main(string args)try double x,y,z;Console.Write(请输入实数的被除数:);x=double.Parse(Console.ReadLine();Console.Write(请输入实数的除数:);y=double.Parse(Console.ReadLine();if(y!=0)z=x/y;else throw new MyException(除数为零没有意义);Console.WriteLine(相除结果:+z);catch(Exception e)Console.WriteLine(异常:+e.Message);运算结果与例6-6完全相同。,6.7 启用或禁用整数运算溢出检查checked/unchecked,溢出:执行整数算术运算,运算结果超出范围。用关键字checked启用整数运算结果的溢出检查。用unchecked 禁用溢出检查,默认是禁用状态。checked和unchecked可用于表达式(当一元运算符):checked(表达式)unchecked(表达式)checked和unchecked也可用于语句块:checked 代码块 unchecked 代码块 如果不启用溢出检查,发生溢出时运算结果与实际不符。启用检查,发生溢出时会引发“算术运算导致溢出”异常OverflowException。,【例6-8】创建控制台应用程序项目,编写带溢出检查的整数乘法运算程序。,编写Main方法代码:string outString=;try int x,y,z;Console.Write(请输入整数的被乘数:);x=int.Parse(Console.ReadLine();Console.Write(请输入整数的乘数:);y=int.Parse(Console.ReadLine();z=checked(x*y);/或 checked z=x*y;outString=相乘结果:+z;catch(Exception e)outString=异常:+e.Message;finally Console.WriteLine(outString);,6.8 本章小结,异常,就是运行时发生了意外,无法正常运行。采用try-catch、try-catch-finally等代码块来捕获和处理异常。catch子块允许出现多个,其排列顺序很重要,最后的catch子块通常捕获最高层次的Exception异常。所捕获到的异常信息可通过Message属性来获取。如果异常处理代码块包含finally子块,则不管是否发生异常,该子块的代码最终都会执行。也可人为地给定一些条件,再用throw语句主动抛出异常。例如抛出实数相除时“除数为零没有意义”异常。异常的种类与层次结构。系统预定义的异常类很多,它们通过单重继承形成了层次结构,最上层的就是Exception。自定义异常类:可通过继承Exception类定义。本章最后还介绍了使用checked、unchecked表达式或语句块启用、禁用整数运算溢出检查。,6.9 项目实训6:带异常处理的乘除运算,1.创建一个WPF应用程序项目,编写带异常处理的整数除法运算程序,要求使用多个catch语句块捕捉不同类型的异常。2.在上题项目基础上,添加第二个WPF窗口,编写实数除法运算代码。分两种情况:一是除数为0时抛出异常;二是除数为0时不抛出异常。3.在上题项目基础上,添加第三个WPF窗口,编写整数乘法运算代码,也分两种情况:启用/禁用溢出检查。4.(选做)创建一个Windows窗体应用程序项目,缺省创建了一个窗体,再添加2个窗体,实现第1、2、3题功能,即带异常处理的整数除法、抛出除数为零异常的实数除法、整数乘法溢出检查等。,谢谢!返回目录 结束放映,