书签 分享 收藏 举报 版权申诉 / 49
上传文档赚钱

类型C++大学基础教程课件.ppt

  • 上传人(卖家):晟晟文业
  • 文档编号:3802684
  • 上传时间:2022-10-14
  • 格式:PPT
  • 页数:49
  • 大小:359.75KB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《C++大学基础教程课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    C+ 大学 基础教程 课件
    资源描述:

    1、C+大学基础教程第第13章章 异常处理异常处理程序设计的要求之一就是程序的健壮性。希望程序设计的要求之一就是程序的健壮性。希望程序在运行时能够不出或者少出问题。但是,程序在运行时能够不出或者少出问题。但是,在程序的实际运行时,总会有一些因素会导致在程序的实际运行时,总会有一些因素会导致程序不能正常运行。异常处理(程序不能正常运行。异常处理(Exception Handling)就是要提出或者是研究一种机制,能够就是要提出或者是研究一种机制,能够较好的处理程序不能正常运行的问题。较好的处理程序不能正常运行的问题。2022-10-143/45为什么强调异常处理电信系统的特点电信系统的特点要求稳定,

    2、全年运行时间要求稳定,全年运行时间 99.999%用户数量巨大,使用频繁用户数量巨大,使用频繁例:例:BBS系统系统程序:程序:稳定稳定功能功能第十三章 异常处理13.1 异常和异常处理异常和异常处理 13.2 C+异常处理机制异常处理机制 13.3 用类的对象传递异常用类的对象传递异常 13.4 异常处理中的退栈和对象析构异常处理中的退栈和对象析构 2022-10-145/4513.1.1 异常及其特点 异常(异常(Exceptions)是程序在运行时可能出现是程序在运行时可能出现的会导致程序运行终止的错误。的会导致程序运行终止的错误。编译系统检查出来的语法错误,程序的逻辑错误,编译系统检查

    3、出来的语法错误,程序的逻辑错误,都不属于异常。都不属于异常。异常是一个可以正确运行的程序在运行中可能发生异常是一个可以正确运行的程序在运行中可能发生的错误。的错误。常见的异常,如:常见的异常,如:系统资源不足。如内存不足;磁盘空间不足等。系统资源不足。如内存不足;磁盘空间不足等。用户操作错误导致运算关系不正确。如出现分母为用户操作错误导致运算关系不正确。如出现分母为0,数组越界等。数组越界等。2022-10-146/4513.1.2 异常处理方法及举例对于程序中的异常,通常有三种处理的方法:对于程序中的异常,通常有三种处理的方法:不作处理。不作处理。发布相应的错误信息,然后,终止程序的运行。发

    4、布相应的错误信息,然后,终止程序的运行。适当的处理异常,一般应该使程序可以继续运行。适当的处理异常,一般应该使程序可以继续运行。而在而在C+中,异常处理(中,异常处理(Exception Handling)就是用就是用trythrowcatch的模式进行异常处理的模式进行异常处理的机制。的机制。2022-10-147/45 例例13.1 程序将连续地输入两个实数,通过调用函数,返回这两个程序将连续地输入两个实数,通过调用函数,返回这两个数相除的商。并且要注意除数不能为数相除的商。并且要注意除数不能为0。#include#include double divide(double a,double

    5、 b)if(b=0)/检测分母是不是为检测分母是不是为0cout 除数不可以等于除数不可以等于0!endl;abort();/调用调用abort函数终止运行函数终止运行return a/b;void main()调用调用divide 用一般的方法处理程序异常2022-10-148/45 如果出现分母为如果出现分母为0 的情况,运行将出现以下结的情况,运行将出现以下结果:果:第十三章 异常处理13.1 异常和异常处理异常和异常处理 13.2 C+异常处理机制异常处理机制 13.3 用类的对象传递异常用类的对象传递异常 13.4 异常处理中的退栈和对象析构异常处理中的退栈和对象析构 2022-10

    6、-1410/4513.2 C+异常处理机制 try 受保护语句受保护语句;throw 异常异常;其他语句其他语句;catch(异常类型异常类型)异常处理语句异常处理语句;检测和抛掷检测和抛掷异常异常扑获和处理扑获和处理异常异常try模块模块2022-10-1411/45void f()throw 异常异常main()tryf();其他语句其他语句;catch(异常类型异常类型)异常处理语句异常处理语句;2022-10-1412/4513.2 C+异常处理机制 在在C+中,将异常检测程序所抛掷(中,将异常检测程序所抛掷(throw)的)的“带有异常信息的对象带有异常信息的对象”称为称为“异常异常

    7、”。而将捕获异常的处理程序称为异常处理程序而将捕获异常的处理程序称为异常处理程序(Exception Handler)。)。2022-10-1413/45例例13.2 用用C+的异常处理机制,重新处理例的异常处理机制,重新处理例13.1。#include#include using namespace std;double divide(double a,double b)if(b=0)throw 输入错误:除数不可以等于输入错误:除数不可以等于0!;return a/b;2022-10-1414/45void main()double x,y,z;cout x y)tryz=divide(x

    8、,y);catch(const char*s)/start of exception handlercout s n;cout 输入一对新的实数:输入一对新的实数:;continue;/end of handler cout x 除以除以 y 等于等于 z n;cout 输入下一组数输入下一组数:;cout 程序结束,再见程序结束,再见!n;2022-10-1415/4513.2 C+异常处理机制程序运行的一种结果是:程序运行的一种结果是:输入两个实数输入两个实数 x 和和 y:1.2 3.2 x 除以除以 y 等于等于 0.375 输入下一组数输入下一组数:3.4 0 输入错误:除数不可以等

    9、于输入错误:除数不可以等于0!输入一对新的实数:输入一对新的实数:2.3 4.5 x 除以除以 y 等于等于 0.511111 输入下一组数输入下一组数:q 程序结束,再见程序结束,再见!2022-10-1416/4513.2 C+异常处理机制阅读这个程序,可以注意以下几点:阅读这个程序,可以注意以下几点:在在try的复合语句中,调用了函数的复合语句中,调用了函数divide。因此,尽因此,尽管管divide函数是在函数是在try模块的外面定义的,它仍然是模块的外面定义的,它仍然是属于属于try模块:在模块:在try语句块中运行;语句块中运行;divide函数检测到异常后,抛掷出一个字符串作为

    10、异函数检测到异常后,抛掷出一个字符串作为异常对象,异常的类型就是字符串类型;常对象,异常的类型就是字符串类型;catch程序块指定的异常对象类型是程序块指定的异常对象类型是char*,可以捕可以捕获字符串异常。捕获异常后的处理方式是通过获字符串异常。捕获异常后的处理方式是通过continue语句,跳过本次循环,也不输出结果,直接进入语句,跳过本次循环,也不输出结果,直接进入下一次循环,要求用户再输入一对实数。下一次循环,要求用户再输入一对实数。2022-10-1417/4513.2 C+异常处理机制例例13.2的执行过程可以简要的表示如下:的执行过程可以简要的表示如下:第十三章 异常处理13.

    11、1 异常和异常处理异常和异常处理 13.2 C+异常处理机制异常处理机制 13.3 用类的对象传递异常用类的对象传递异常 13.4 异常处理中的退栈和对象析构异常处理中的退栈和对象析构 2022-10-1419/4513.3 用类的对象传递异常throw语句所传递的异常,可以是各种类型的:语句所传递的异常,可以是各种类型的:整型、实型、字符型、指针,等等。整型、实型、字符型、指针,等等。也可以用类对象来传递异常。优势在于可以传也可以用类对象来传递异常。优势在于可以传递和处理异常有关的行为或者方法。递和处理异常有关的行为或者方法。专门用来传递异常的类称为异常类。异常类可专门用来传递异常的类称为异

    12、常类。异常类可以是用户自定义的,也可以是系统提供的以是用户自定义的,也可以是系统提供的exception类。类。2022-10-1420/4513.3.1用户自定义类的对象传递异常 我们用第十章中的栈类模板来作为例子,类模我们用第十章中的栈类模板来作为例子,类模板中两个主要的函数板中两个主要的函数push和和pop的定义中,都的定义中,都安排了错误检查的语句,以检查栈空或者栈满安排了错误检查的语句,以检查栈空或者栈满的错误。由于的错误。由于pop函数是有返回值的,在栈空函数是有返回值的,在栈空的条件下,是没有数据可以出栈的。尽管的条件下,是没有数据可以出栈的。尽管pop函数可以检测到这种错误,

    13、但是,也不可能正函数可以检测到这种错误,但是,也不可能正常的返回,于是只好通过常的返回,于是只好通过exit函数调用结束程函数调用结束程序的执行。序的执行。2022-10-1421/452.43.21push(10.8)2.4push(2.4)2.43.21push(3.21)10.8push(1.2)pop()pop()pop()10.82.43.21pop()2022-10-1422/4513.3.1用户自定义类的对象传递异常现在,我们用现在,我们用C+异常处理的机制,改写这个异常处理的机制,改写这个程序。可以定义两个异常类:程序。可以定义两个异常类:“栈空异常栈空异常”类类在在try块中

    14、,如果检测到块中,如果检测到“栈空异常栈空异常”,就,就throw一一个个“StackEmptyException”类的对象类的对象“栈满异常栈满异常”类。类。如果检测到如果检测到“栈满异常栈满异常”,就,就throw一个一个“StackOverflowException”类的对象。类的对象。2022-10-1423/45/例例13.3:带有异常处理的栈:带有异常处理的栈#include using namespace std;class StackOverflowException/栈满异常类栈满异常类public:StackOverflowException()StackOverflowE

    15、xception()void getMessage()cout 异常:栈满不能入栈。异常:栈满不能入栈。endl;class StackEmptyException/栈空异常类栈空异常类public:StackEmptyException()StackEmptyException()void getMessage()cout 异常:栈空不能出栈。异常:栈空不能出栈。endl;2022-10-1424/45template /类模板定义类模板定义class MyStack T StackBufferi;int size;int top;public:MyStack(void):size(i)to

    16、p=i;void push(const T item);T pop(void);2022-10-1425/45template /push成员函成员函数定义数定义void MyStack:push(const T item)if(top 0)StackBuffer-top=item;else throw StackOverflowException();/抛掷抛掷对象异常对象异常 return;2022-10-1426/45 template /pop成员函数成员函数定义定义T MyStack:pop(void)if(top i)return StackBuffertop+;else thro

    17、w StackEmptyException();/抛掷另一个对抛掷另一个对象异常象异常2022-10-1427/45 void main()/带有异常处理的类模带有异常处理的类模板测试程序板测试程序MyStack ss;for(int i=0;i10;i+)try if(i%3)coutss.pop()endl;else ss.push(i);catch(StackOverflowException&e)e.getMessage();catch(StackEmptyException&e)e.getMessage();coutByen;程序执行的结果是:程序执行的结果是:0 0异常:栈空不能出

    18、栈。异常:栈空不能出栈。3 3异常:栈空不能出栈。异常:栈空不能出栈。6 6异常:栈空不能出栈。异常:栈空不能出栈。ByeBye2022-10-1428/4513.3.1用户自定义类的对象传递异常这个例子和例这个例子和例13.2有一些明显不同的地方:有一些明显不同的地方:通过对象传递参数。具体来说,是在通过对象传递参数。具体来说,是在throw语句中直语句中直接调用异常类的构造函数,生成一个无名对象(如:接调用异常类的构造函数,生成一个无名对象(如:throw StackEmptyException();),),来传递异常的。来传递异常的。在在catch语句中规定的异常类型则是异常类对象的引语

    19、句中规定的异常类型则是异常类对象的引用。当然,也可以直接用异常类对象作为异常。用。当然,也可以直接用异常类对象作为异常。2022-10-1429/4513.3.1用户自定义类的对象传递异常通过异常类对象的引用,直接调用异常类的成员函通过异常类对象的引用,直接调用异常类的成员函数数getMessage,来处理异常。来处理异常。在在try语句块后面直接有两个语句块后面直接有两个catch语句来捕获异常。语句来捕获异常。也就是说,要处理的异常增加时,也就是说,要处理的异常增加时,catch语句的数目语句的数目也要增加。也要增加。运行结果表明,运行结果表明,10次循环都已经完成。没有出现因次循环都已经

    20、完成。没有出现因为空栈时不能出栈而退出运行的情况。为空栈时不能出栈而退出运行的情况。2022-10-1430/4513.3.2 用exception类对象传递异常C+提供了一个专门用于传递异常的类:提供了一个专门用于传递异常的类:exception类。可以通过类。可以通过exception类的对象来传递异类的对象来传递异常。常。class exception public:exception();/默认构造函数默认构造函数 exception(char*);/字符串作参数的构造函数字符串作参数的构造函数 exception(const exception&);exception&operato

    21、r=(const exception&);virtual exception();/虚析构函数虚析构函数 virtual char*what()const;/what()虚函数虚函数private:char*m_what;2022-10-1431/4513.3.2 用exception类对象传递异常其中和传递异常最直接有关的函数有两个:其中和传递异常最直接有关的函数有两个:带参数的构造函数。参数是字符串,一般就是检测带参数的构造函数。参数是字符串,一般就是检测到异常后要显示的异常信息。到异常后要显示的异常信息。what()函数。返回值就是构造函数。返回值就是构造exception类对象时所类对

    22、象时所输入的字符串。可以直接用插入运算符输入的字符串。可以直接用插入运算符“”在显在显示器上显示。示器上显示。2022-10-1432/4513.3.2 用exception类对象传递异常如果捕获到如果捕获到exception类对象后,只要显示关于类对象后,只要显示关于异常的信息,则可以直接使用异常的信息,则可以直接使用exception类。如类。如果除了错误信息外,还需要显示其他信息,或果除了错误信息外,还需要显示其他信息,或者作其他的操作,则可以定义一个者作其他的操作,则可以定义一个exception类类的派生类,在派生类中可以定义虚函数的派生类,在派生类中可以定义虚函数what的的重载函

    23、数,以便增加新的信息的显示。重载函数,以便增加新的信息的显示。2022-10-1433/4513.3.2 用exception类对象传递异常例例13.4 定义一个简单的数组类。在数组类中重定义一个简单的数组类。在数组类中重载载“”运算符,目的是对于数组元素的下标运算符,目的是对于数组元素的下标进行检测。如果发现数组元素下标越界,就抛进行检测。如果发现数组元素下标越界,就抛掷一个对象来传递异常。并且要求处理异常时掷一个对象来传递异常。并且要求处理异常时可以显示越界的下标值。可以显示越界的下标值。2022-10-1434/4513.3.2 用exception类对象传递异常我们使用我们使用exce

    24、ption类的对象来传递对象。但是,类的对象来传递对象。但是,直接使用直接使用exception类对象还是不能满足例题的类对象还是不能满足例题的要求。因为不能传递越界的下标值。要求。因为不能传递越界的下标值。为此,可以定义一个为此,可以定义一个exception类的派生类类的派生类ArrayOverflow。其中包含一个数据成员其中包含一个数据成员k。在构造在构造ArrayOverflow类对象时,用越界的下标值初类对象时,用越界的下标值初始化这个数据始化这个数据k。在在catch块中捕获到这个对象块中捕获到这个对象后,可以设法显示对象的后,可以设法显示对象的k值。值。2022-10-1435

    25、/45/例例13.4 用用exception类参与处理异常类参与处理异常#include#include using namespace std;class ArrayOverflow:public exception/exception类类的派生类的派生类public:ArrayOverflow:ArrayOverflow(int i):exception(数组越界异常数组越界异常!n)k=i;const char*what()/重新定义的重新定义的what()函数函数cout数组下标数组下标k=0&isz)return pi;throw ArrayOverflow(i);2022-10-1

    26、437/45 void f(MyArray&v);void main()MyArray A(10);f(A);void f(MyArray&v)/for(int i=0;i3;i+)try if(i!=1)vi=i;coutviendl;else vv.size()+10=10;catch(ArrayOverflow&r)coutr.what();/for循环结束循环结束 程序运行后输出:程序运行后输出:0 0数组下标数组下标2020越界越界数组越界异常数组越界异常!2 213.4 13.4 异常处理中的退栈异常处理中的退栈 和对象析构和对象析构 2022-10-14北京邮电大学电信工程学院计

    27、算机技术中心39/4513.4异常处理中的退栈和对象析构 在函数调用时,函数中定义的自动变量将在堆在函数调用时,函数中定义的自动变量将在堆栈中存放。结束函数调用时,这些自动变量就栈中存放。结束函数调用时,这些自动变量就会从堆栈中弹出,不再占用堆栈的空间,这个会从堆栈中弹出,不再占用堆栈的空间,这个过程有时被称为过程有时被称为“退栈退栈”(Stack unwinding)。)。其他的结束动作还包括调用析构函数,释放函其他的结束动作还包括调用析构函数,释放函数中定义的对象。数中定义的对象。2022-10-14北京邮电大学电信工程学院计算机技术中心40/4513.4异常处理中的退栈和对象析构但是,如

    28、果函数执行时出现异常,并且只是采但是,如果函数执行时出现异常,并且只是采用简单的显示异常信息,然后退出(用简单的显示异常信息,然后退出(exit)程程序的做法,则程序的执行就会突然中断,结束序的做法,则程序的执行就会突然中断,结束函数调用时必须完成的退栈和对象释放的操作函数调用时必须完成的退栈和对象释放的操作也不会进行。这样的结果是很不希望的。也不会进行。这样的结果是很不希望的。2022-10-1441/45 float function3(int k)/function3中可能有中可能有异常异常if(k=0)coutfunction3中发生异常中发生异常n;/显示异常信息显示异常信息 exi

    29、t(1);/退出执行退出执行 else return 123/k;void function2(int n)ForTest A12;function3(n);/第三次调用第三次调用void function1(int m)ForTest A11;function2(m);/第二次调用第二次调用void main()function1(0);/第一次调用第一次调用 2022-10-14北京邮电大学电信工程学院计算机技术中心42/4513.4异常处理中的退栈和对象析构程序运行后显示:程序运行后显示:function3中发生异常中发生异常 在在function1和和fuction2中分别定义了中分别

    30、定义了ForTest类类的对象。如果函数可以正常退出,这些对象将的对象。如果函数可以正常退出,这些对象将被释放。被释放。但是,程序运行后只显示了异常信息。没有析但是,程序运行后只显示了异常信息。没有析构函数被调用的迹象。说明所创建的对象没有构函数被调用的迹象。说明所创建的对象没有被释放。被释放。如果采用如果采用C+的异常处理机制来进行处理。情的异常处理机制来进行处理。情况就会完全不同。况就会完全不同。2022-10-14北京邮电大学电信工程学院计算机技术中心43/4513.4异常处理中的退栈和对象析构如果在如果在function3中用中用throw语句来抛掷异常,语句来抛掷异常,就会开始就会开

    31、始function3的退栈。的退栈。然后,返回到函数然后,返回到函数function2开始开始function2的退的退栈,并且调用栈,并且调用ForTest类析构函数,释放对象类析构函数,释放对象A12。接着,返回到函数接着,返回到函数function1开始开始function1的退的退栈,并且调用栈,并且调用ForTest类析构函数,释放对象类析构函数,释放对象A11。2022-10-1444/45 例例13.6 用用C+异常处理机制来重新编写例异常处理机制来重新编写例13.5。/例例 13.6:用用C+异常处理机制,对象可以完全释放异常处理机制,对象可以完全释放/Demonstratin

    32、g stack unwinding.#include#include#include using namespace std;class ForTestpublic:ForTest()/析构函析构函数数 coutForTest类析构函数被调用类析构函数被调用n;/ForTest类定义结束类定义结束2022-10-1445/45 float function3(int k)/function3中可中可能有异常能有异常if(k=0)throw exception(function3中出现异常中出现异常n);/抛掷异常类对象抛掷异常类对象 else return 123/k;void functio

    33、n2(int n)ForTest A12;function3(n);/第三次第三次调用调用void function1(int m)ForTest A11;function2(m);/第二次调用第二次调用2022-10-1446/45 void main()try function1(0);/第一次调第一次调用用 catch(exception&error)couterror.what()endl;程序运行结果显示:程序运行结果显示:ForTest类析构函数被调用类析构函数被调用 ForTest类析构函数被调用类析构函数被调用 function3中出现异常中出现异常总结本章介绍了本章介绍了C+

    34、异常处理的机制。在程序设计异常处理的机制。在程序设计中使用这样的异常处理机制,有助于提高程序中使用这样的异常处理机制,有助于提高程序的健壮性、可读性。而且可以防止因为程序不的健壮性、可读性。而且可以防止因为程序不正常结束而导致的资源泄漏,如创建的对象不正常结束而导致的资源泄漏,如创建的对象不能释放等。能释放等。本章没有介绍多种异常处理的结构,而是希望本章没有介绍多种异常处理的结构,而是希望读者能够抓住最基本的结构:读者能够抓住最基本的结构:try模块。模块。另外一个重要的内容就是通过用户自定义类的另外一个重要的内容就是通过用户自定义类的对象来传递异常。对象来传递异常。2022-10-1448/45作业2022-10-1449/45进度记录2006-4-28:22页页

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:C++大学基础教程课件.ppt
    链接地址:https://www.163wenku.com/p-3802684.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库