- 1、本文档共37页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
8.5 异常的使用 5.throw throw后面带一个类型的实例,throw和catch的关系就像是函数调用,catch指定形参,throw给出实参。 throw不一定非要出现在try之后的语句块中,它可以出现在任何需要的地方,只要最终有catch可以捕捉它即可,即使在catch子句中,仍然可以继续throw,这时有两种情况: 重抛异常,重抛异常时throw不带参数。 throw一个新类型的异常。 8.5 异常的使用 try { … } catch( int ) { // 抛出一个MyException类型的异常 throw MyException(my exception); } catch( float ) { throw; // 重新抛出当前的浮点数类型异常 } 8.5 异常的使用 在函数声明后的throw关键字称为异常规范,通过异常规范,在函数声明中,可以指定该函数能够直接或间接抛出的异常集合(可不抛出任何异常),异常规范保证函数不会抛出未列出的异常,例如: void foo( ) throw (int); // 只能抛出int型异常 void bar( ) throw ( ); // 不抛出任何异常 void foobar( ); // 可以抛出任何异常,也可以不抛出异常 6.异常规范 8.5 异常的使用 下面函数的异常规范保证foo( )只抛出A或B类型的异常: class A; class B; void foo( ) throw( A, B); 如果一个函数的声明中带有throw限定符,则在函数定义中也必须同样出现: void foo( ) throw (int) { … } 8.6 标准库的异常类 C++标准库定义了如下的标准异常类继承体系: exception logic_error // 逻辑错误 invalid_argument length_error out_of_range runtime_error // 运行时错误 range_error overflow_error underflow_error bad_alloc bad_cast bad_exception bad_typeid 8.6 标准库的异常类 【例 8.5】异常抛出与处理示例。 // main.cpp #include iostream void foo( ) throw (std::out_of_range ) { // … if (true) { // 为了抛出异常 … throw std::out_of_range(error occured!); } // … } 8.6 标准库的异常类 int main( ) { try { foo( ); // … } catch ( const std::out_of_range e ) { std::cerr e.what( ) \n; // return -1; } return 0; } 运行结果: error occured! * * C++程序设计 第8章 RTTI与异常处理 8.1 RTTI概述 8.2 dynamic_cast运算符 8.3 typeid运算符 8.4 异常 8.5 异常的使用 8.6 标准库的异常类 8.7 本章小结 第8章 RTTI与异常处理 8.1 RTTI概述 RTTI(Run-Time Type Identification,运行时类型识别),支持程序在运行时,根据基类指针或引用,确定其所指对象的实际类型。 RTTI是RAD开发工具(如MFC)的基础。在处理异类容器,以及在实现调试器程序时,都需要在运行时得知对象的类型,而虚函数机制不能满足需求,那么如何确定对象的动态类型呢? C++为此提供的支持是内建的RTTI运算符:dynamic_cast和typeid。 8.1 RTTI概述 dynamic_cast运算符,支持程序在运行时,将基类指针安全转换成派生类指针,或把指向基类的对象安全转换成派生类的引用,所谓安全是指转换成功后所得的指针或引用是一定可用的。 typeid运算符,获得指针或引用所指对象运行时的实际类型。 8.2 dynamic_cast运算符 为什么需要dynamic_cast运算符? class Employee { // 雇员类,基类 public: virtual int salary( ); }; class Captain : public Employee { // 机长 public: int salary(
您可能关注的文档
- C#应用开发与实践 教学课件 作者 胡学钢 第19章 课程设计——雷速下载专家.ppt
- C#应用开发与实践 教学课件 作者 胡学钢 第20章 课程设计——快递单打印系统.ppt
- C#语言程序设计李继武 彭德林电子教案 第1章.ppt
- C#语言程序设计李继武 彭德林电子教案 第2章.ppt
- C#语言程序设计李继武 彭德林电子教案 第3章.ppt
- C#语言程序设计李继武 彭德林电子教案 第4章.ppt
- C#语言程序设计李继武 彭德林电子教案 第5章.ppt
- C#语言程序设计李继武 彭德林电子教案 第6章.ppt
- C#语言程序设计李继武 彭德林电子教案 第7章.ppt
- C#桌面系统开发案例教程 教学课件 作者 李建青 第八章.ppt
文档评论(0)