范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

C带析构语义的类的异常处理抛出异常栈展开自动析构

  我们在编写应用软件时,不仅要保证软件的正确性,而且应该具有容错能力。也就是说,不仅在正确的环境条件下、在用户正确操作时要运行正确,而且在环境条件出现意外或用户使用操作不当的情况下,也应该有正确合理的表现,不能轻易出现死机,更不能出现灾难性的后果。由于环境条件和用户操作的正确性是没有百分之百保障的,所以我们在设计程序时,就要充分考虑到各种意外情况,并给予恰当的处理。这就是我们所说的异常处理。
  程序运行中的有些错误是可以预料但不可避免的,例如内存空间不足、硬盘上的文件被移动、打印机未连接好等由系统运行环境造成的错误。这时要力争做到允许用户排除环境错误,继续运行程序;至少要给出适当的提示信息,提供更友好的交互。这就是异常处理程序的任务。
  在一个大型软件中,由于函数之间有着明确的分工和复杂的调用关系,发现错误的函数往往不具备处理错误的能力。这时它就引发一个异常,希望它的调用者能够捕获这个异常并处理这个错误。如果调用者也不能处理这个错误,还可以继续传递给上级调用者去处理,这种传播会一直继续到异常被处理为止。如果程序始终没有处理这个异常,最终它会被传到C++ 运行系统那里,运行系统捕获异常后通常只是简单地终止这个程序。
  C++ 的异常处理机制使得异常的引发和处理不必在同一函数中,这样底层的函数可以着重解决具体问题,而不必过多地考虑对异常的处理。上层调用者可以在适当的位置设计对不同类型异常的处理。
  为了加强程序的可读性,使函数的用户能够方便地知道所使用的函数会抛掷哪些异常,可以在函数的声明中列出这个函数可能抛掷的所有异常类型,例如:void fun() throw(A,B,C,D);
  这表明函数fun()能够且只能够抛掷类型A 、B、C 、D及其子类型的异常。如果在函数的声明中没有包括异常接口声明,则此函数可以抛掷任何类型的异常,例如:void fun();
  一个不抛掷任何类型异常的函数可以进行如下形式的声明:void fun () throw() ;
  C++异常处理的真正能力,不仅在于它能够处理各种不同类型的异常,还在于它具有为异常抛掷前构造的所有局部对象自动调用析构函数的能力。
  如果try块中发生的异常没有匹配的catch处理程序,或者不在try块中的语句发生异常,则包含该语句的函数会立即终止执行,试图在它的主调函数中查找包含异常的try块。该过程称为栈展开。catch语句如果匹配异常对象成功,在完成了对catch语句的参数的初始化(对传值参数完成了参数对象的copy构造)之后,对同层级的try块执行栈展开。
  当特定作用域(scope)中抛出异常但是却没有捕获时(该scope内的throw没有try包裹,没有被catch,大部分情况是在主调函数中被catch),就会展开函数调用栈,试图在外层的try...catch块中捕获这个异常。函数调用栈展开意味着没有捕获该异常的函数终止执行,该函数内的所有局部变量被删除, 控制返回到最初调用该函数的语句。如果该函数调用语句包含在try块中,就会试图捕获该异常。如果该函数调用语句没有包含在try块中,则再次发生栈展开。如果一直没有可捕获该异常的catch处理程序, 就会调用terminate函数终止程序的执行。// Demonstrating stack unwinding. #include  #include  using namespace std;  // function3 throws runtime error void function3() throw ( runtime_error ) {    cout << "In function 3" << endl;     // no try block, stack unwinding occurs, return control to function2(caller)    throw runtime_error( "runtime_error in function3" ); // no print }   // function2 invokes function3 void function2() throw ( runtime_error ) {    cout << "function3 is called inside function2" << endl;    function3(); // stack unwinding occurs, return control to function1(caller) }   // function1 invokes function2 void function1() throw ( runtime_error ) {    cout << "function2 is called inside function1" << endl;    function2(); // stack unwinding occurs, return control to main(caller) }   // demonstrate stack unwinding int main() {    // invoke function1    try     {       cout << "function1 is called inside main" << endl;       function1(); // call function1 which throws runtime_error    }     catch ( runtime_error &error ) // handle runtime error    {       cout << "Exception occurred: " << error.what() << endl;       cout << "Exception handled in main" << endl;    } }
  main函数中,try块调用functionl。然后,function1调用funclion2,function2转而调用funclion3。function3抛出一个rumime_error对象。然而,由于该行的throw语句没有包含在try块中,因此发生栈展开,function3在throw处终止,然后将控制返回到function2中调用function的语句。由于该行没有包含在try块中,因此再次发生栈展开,function2在该行终止,并将控制返回到function1中调用function2的语句。由于该行没有包含在try块中,因此又一次发生栈展开,function1在函数调用处终止,并将控制返回到main函数中调用function1的语句。由于该语句包含在捕获并处理该异常。使用的what函数以显示异常信息。
  某一scope内抛出异常,在该scope内因未被try包裹,未被catch,引发栈展开(stack unwinding),销毁局部对象,为局部对象调用析构函数:#include   #include   using namespace std;  class MyException  {  public:      MyException(const string &message) : message(message) {}      ~MyException() {}      const string &getMessage() const { return message; }  private:      string message;  };  class Demo {  public:      Demo() { cout << "Constructor of Demo" << endl; }      void print(){          cout<<"I am a Demo"<print();         free(p);     }     catch (MyException& e) {	         cout << "Caught an exception: " << e.getMessage() << endl;     }      catch (char *str){         cout << str <
八月手机推荐(3)IQOO7IQOO7是21年5月份IQOO出的一款旗舰级手机外观屏幕采用了6。62英寸三星AMOLED材质挖孔全面屏,120Hz高刷性能采用了骁龙888处理器增强版LDDR5增强版宋PLUS新能源售14。68万元起欢迎试驾驭见皆引领!全球首款宽体超混SUV领航上市!宋PLUSDMi上市价14。68万起(综合补贴后)创新采用骁云插混专用1。5L高效发动机高效EHS电混系统,达到短途用电经济节省,长途用宋PLUS新能源售14。68万元起欢迎试驾驭见皆引领!全球首款宽体超混SUV领航上市!宋PLUSDMi上市价14。68万起(综合补贴后)创新采用骁云插混专用1。5L高效发动机高效EHS电混系统,达到短途用电经济节省,长途用宋PLUS热销中购车让利3000元新B级SUV超感座驾夺慕上市。五星安全车身设计标准配备骁云动力1。5TI高功率发动机,性能全面升级7速双离合变速箱,全新湿式7速双离合变速器全面进化,显著提升平顺性,传动效率达到9交大紫宸进阶你的理想人生人是万物的尺度境界越高,对居所的追求更为挑剔时代澎湃向前,城市人居聚变理想中的人生,该如何进阶?01hr品牌代言人居品质每一个作品的厚积薄发都离不开品牌的实力积淀对于置业者而言,品招生资讯港中大(深圳)MBM2022级第四批次入学申请已启动项目简介香港中文大学(深圳)管理学理学硕士项目为学生提供专业与实践相结合的商业管理课程体系,引导和鼓励创新和创业实践。本专业毕业生将掌握商业管理的理论和技能,获得宏观视野创新思维和孝当先中老年健康生活馆是新时代的创业项目创业要想成功离不开一个好的项目,目前有什么项目值得投入,其实现在我国老龄产业发展前景广阔,开一家中老年健康生活馆,为中老年人提供健康养老的服务,致力于养老养生行业,那么孝当先是您很西安建筑模板厂为您介绍解决建筑模板变形问题,从这四点来看模板工程的目的是保证混凝土工程的质量和施工安全,加快施工进度,降低工程成本。但是,某些建筑模板通常在使用一段时间后会变形。西安建筑模板工程是根据设计要求所制作的临时支撑结构,以便混兰研南极丛梗藻贵妇金丝面膜,拯救大干皮秋分以后,南北方温度骤降,西北风吹得人脸上得皮肤干疼。无论是干冷还是湿冷的天气,脸部皮肤变得敏感,出现如干燥缺水脱皮泛红等皮肤现象。你以为这是换季常有的现象,其实这是因为缺水,肌肤为什么草饲奶粉这么火?草饲奶粉好在哪?现在的技术越来越发达,在奶粉领域竟然也出现了很多新概念的奶粉。例如最近比较火的草饲奶粉。什么是草饲奶粉?它和普通奶粉有什么不一样?它值得各位妈妈购买吗?本期我就带领大家一起来看看这宋PLUS新能源售14。68万元起欢迎试驾驭见皆引领!全球首款宽体超混SUV领航上市!宋PLUSDMi上市价14。68万起(综合补贴后)创新采用骁云插混专用1。5L高效发动机高效EHS电混系统,达到短途用电经济节省,长途用
美的空调广告说一晚只需一度电,是不是在欺诈消费者?大家好,我是装修第一站的院长,专业解决家居知识问题,装修水深,愿带你乘风破浪!可别说,除了美的外,现在很多品牌都宣传自家的空调是一晚低至一度电。这些空调都是变频空调,而且能效等级为华为与联想齐名,为何马云雷军都与柳传志合影,任正非却被冷落纵观改革开放40年来,如果说近20年是互联网时代,那前20年可谓是联想的时代,当年任正非看柳传志,如同马云雷军等一种互联网大佬仰望搜狐的张朝阳一样。翻开媒体相册也会发现,与柳传志合争夺年轻人,纯电小车全面开花,替代燃油车胜算几何?在燃油车领域,小型车市场已经极度萎缩,但是在电动车领域却枝繁叶茂。纯电动车的启动是从高端市场开始的,毕竟有钱人才有试错(或者说尝鲜)的资本,市场还是偏小众量级不够,难言替代。但是在麒麟芯片耗尽,5G被封,华为能否再战?莫慌,任正非早有两大准备相信大家都知道,无论是华为新发布的P50系列还是上线的多款旧终端,大多都是搭载高通骁龙芯片,仅有P50Pro采用麒麟9000芯片。而近日,又有媒体爆料,华为即将发布的nova9新机任正非搞研发烧掉的1000亿,啥时候还我?徐直军已经2000亿了在华为3位轮值董事长当中,徐直军属于最为调皮的一个,也是任正非最为器重的一个。当年华为研发失败,烧掉了1000亿。任正非在公司走廊里碰到徐直军便问他我的1000亿,你什么时候还给我2021下半年旗舰机怎么选?三款最佳机型推荐,适合才是最好的家里有矿在换新手机上预算不是问题的朋友来说,如何换一款时尚又拉风的手机呢?时尚,那就和今年的新机脱不开关系。拉风,那就和旗舰机脱不掉关联。今天给大家推荐三款又潮流又能打的新款旗舰机iPhone13权威消息确认9月15日发布,售价有太多惊喜根据多方权威消息称,苹果将在2021年9月15日发布全新一代iPhone13系列手机,根据目前消息来看,此次发布的iPhone13系列在售价方面有太多的惊喜。每一代iPhone发布1万块的手机选什么好?想获取更多新鲜实用的数码知识,点击右上角关注,参与微头条抽奖!我们来对比一下售价同为9999的MotoZ2018和8848M3尊享版,看看哪一款是你的菜。首先我们来看一下外观,88所有手机厂商都受影响?德国出狠招手机必须更新七年系统一般我们说某个手机厂商比较厚道,通常都是说这个厂商能给旗下的手机保持较长时间的系统更新。比如说苹果一直以来最低都是让自己旗下的手机可以保持五年的系统更新,现在基本上还延长到了六年。工信部公示329亿元新能源汽车补贴,这些车企将获补贴超10亿日前,工信部发布关于20162020年度新能源汽车推广应用补助资金清算审核初审情况的公示(以下简称公示)。公示显示,此次清算涉及20162020年完成销售上牌的109。74万辆新能搭载骁龙778G,三星防水新机M52已通过蓝牙认证要说新机曝光这件事情,入网认证蓝牙认证等必不可少的认证单位可以说是给我们带来了太多惊喜,而近日,就有一台三星的新机通过蓝牙认证的信息遭到了曝光,这或许也在暗示这款机型即将上市。事实