c++程序设计PPT第12章 异常与命名空间.pptx

c++程序设计PPT第12章 异常与命名空间.pptx

  1. 1、本文档共18页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第12章 异常和命名空间 12.1 异常处理 程序在运行过程中,由于用户输入错误、越界访问和系统环境资源不足等原因,会导致程序运行不正常或崩溃。在大型应用软件中,相当一部分代码是用于处理程序异常状况的,异常处理是程序的重要组成部分。 12.1.1 异常概述 语法错误是程序在编译、连接时,编译器报告的错误。此类错误产生的原因主要是程序结构不合规则、变量没有定义、拼写错误或缺少相关文件等。编译器基本上能正确指出这类错误的位置,修改也比较简单。 逻辑错误是程序能正常编译、连接并运行,但结果错误或偶尔报错。此类错误是由算法设计有误或考虑问题不周全等因素引起,通过调试或测试,通常能查找出错误的原因。 运行错误是程序在执行过程中错误的输入或运行环境没有满足等因素,导致程序非正常终止。运行错误虽然是由于软件在使用过程中用户使用不当或环境资源不足等外在因素引起的,但通常可以事先预料。为确保用户对软件有良好的体验,提升软件的健壮性,在程序设计阶段必须对运行错误予以充分考虑并做相应的处理。 第12章 异常和命名空间 12.1.1 异常概述 异常处理就是在运行时刻对运行错误进行检测、捕获和提示等过程。C++语言的异常处理机制是把错误处理和正常流程分开描述,异常的引发和处理不在同一个函数中,使得程序的逻辑清晰易读,代码更容易修改,并且易于以集中方式处理各种异常。 12.1.2 抛出异常与堆栈展开 抛出一条表达式来引发一个异常是处理异常的第一步。被抛出的表达式类型以及当前的函数调用链共同决定了哪段处理代码将被用于处理该异常。 处理代码中的catch子句捕获异常后,有可能不能完全处理该异常,此时catch子句在完成一些自己的处理后,可以将该异常重新抛出(Rethrow),把异常传递给函数调用链中上一级的try-catch代码块进行捕获处理。如果上一级调用函数没有捕获从被调函数传递的异常或者就没有try-catch语句,则该异常被传递到更上一级的catch子句,这种传递终止于主函数。如果主函数也没有处理该异常,则调用在C++标准库中定义的terminate()函数终止程序。 重新抛出异常语句为空throw语句,即throw;语句。抛出的异常沿着逆函数调用链向上传递,终止于捕获并处理异常的函数。 第12章 异常和命名空间 12.1.2 抛出异常与堆栈展开 异常使用不当可能导致动态内存空间“泄漏”。下面程序将导致动态内存空间释放语句没有执行。 #include<iostream> using namespace std; double divide(double * m, double * n) { if ((*n) == 0) throw n; return *m / (*n); } int main() { double * pm = new double(100); double * pn = new double(0); try { cout << *pm << "/" << *pn << "=" << divide(pm, pn) << endl; delete pm; delete pn; } catch (double * exp) { cout << "分母不能为" << *exp << endl; } return 0; } pn所指单元中的值为0 抛出异常 没有执行释放语句,内存泄漏! 第12章 异常和命名空间 12.1.2 抛出异常与堆栈展开 【例12-1】重新抛出异常与堆栈展开。 第12章 异常和命名空间 12.1.3 构造函数、析构函数和异常 如果构造函数在执行过程中引发了异常,此时由于对象还没有完全构造,故不会调用类的析构函数来撤消对象。对于构造函数在引发异常前已经构造完成的子对象(包含基类子对象或成员子对象),系统将调用相应的析构函数撤消子对象。但是,对在构造函数引发异常之前用new分配的动态内存空间,由于释放存储空间的delete语句通常在析构函数中而没有执行,因此构造函数中引发异常可能导致内存泄漏。 构造函数中抛出异常将导致对象的析构函数不被执行,分配的资源没有回收,解决这个问题的方法是用局部对象来管理资源(不是用指针),因为异常处理不会破坏对象的特性。当异常发生时,局部对象的析构函数必定会被调用,相应地其管理的资源自然会被释放。 C++11新标准的智能指针shared_ptr和unique_ptr均能自动释放其分配到的资源,而weak_ptr智能指针不支持。 第12章 异常和命名空间 12.1.3 构造函数、析构函数和异常 构造函数在运行其函

文档评论(0)

酱酱 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档

相关课程推荐