当前位置: 首页 > news >正文

c++ primer plus 第15章友,异常和其他:异常,15.3.7 其他异常特性

c++ primer plus 第15章友,异常和其他:异常,15.3.7 其他异常特性

c++ primer plus 第15章友,异常和其他:异常,15.3.7 其他异常特性

文章目录

  • c++ primer plus 第15章友,异常和其他:异常,15.3.7 其他异常特性


15.3.7 其他异常特性
虽然 throw-catch 机制类似于函数参数和函数返回机制,但还是有些不同之处。其中之一是函数 fun()中的返回语句将控制权返回到调用 fun()的函数,但throw 语句将控制权向上返回到第一个这样的函数:包含能够捕获相应异常的try-catch 组合。例如,在程序清单15.12中,当函数hmeans()引发异常时,控制权
将传递给函数 means();然而,当 gmean()引发异常时,控制权将向上传递到 main()。另一个不同之处是,引发异常时编译器总是创建一个临时拷贝,即使异常规范和catch块中指定的是引用。例如,请看下面的代码:

class problem(...);
void super()throw(problem)
{...if (oh_no)problem oops;//construct objectthrow oops;// throw it...}
try{
super();
catch(problem&p)
//statements
}

p将指向 oops的副本而不是 oops本身。这是件好事,因为函数 super()执行完毕后,oops 将不复存在。顺便说一句,将引发异常和创建对象组合在一起将更简单:

throw problem();//construct and throw default problem object

您可能会问,既然 throw 语句将生成副本,为何代码中使用引用呢?毕竟,将引用作为返回值的通常原因是避免创建副本以提高效率。答案是,引用还有另一个重要特征:基类引用可以执行派生类对象。假设有一组通过继承关联起来的异常类型,则在异常规范中只需列出一个基类引用,它将与任何派生类对象匹配。假设有一个异常类层次结构,并要分别处理不同的异常类型,则使用基类引用将能够捕获任何异常对象;而使用派生类对象只能捕获它所属类及从这个类派生而来的类的对象。引发的异常对象将被第一个与之匹配的 catch 块捕获。这意味着catch 块的排列顺序应该与派生顺序相反:

class bad 1{...};
class bad 2:public bad 1(...};
class bad 3:public bad 2{...};
...
void duper()
{
i f(oh_no)throw bad 1();
if (rats)throw bad 2();
if (drat)throw bad 3();
}
try{
duper();
catch(bad 3 &be)// statements
catch(bad 2 &be)(//statements
catch(bad 1 &be)// statements
}

如果将 bad 1&处理程序放在最前面,它将捕获异常bad_1、bad2和 bad 3;通过按相反的顺序排列,bad3异常将被bad3&处理程序所捕获,
提示:如果有一个异常类继承层次结构,应这样排列 catch 块:将捕获位于层次结构最下面的异常类的 catch语句放在最前面,将捕获基类异常的catch 语句放在最后面。
通过正确地排列 catch块的顺序,让您能够在如何处理异常方面有选择的余地。然而,有时候可能不知道会发生哪些异常。例如,假设您编写了一个调用另一个函数的函数,而您并不知道被调用的函数可能引发哪些异常。在这种情况下,仍能够捕获异常,即使不知道异常的类型。方法是使用省略号来表示异常类型,从而捕获任何异常:

catch(...){//statements)// catches any type exception

如果知道一些可能会引发的异常,可以将上述捕获所有异常的catch块放在最后面,这有点类似于switch 语句中的 default:

try{
duper();
}
catch(bad 3 &be)//statements
catch(bad 2 &be)//statements
catch(bad 1 &be)// statements
catch(bad hmean &h)
//statement
scatch(..)//statements
//catch whatever is left

可以创建捕获对象而不是引用的处理程序。在catch语句中使用基类对象时,将捕获所有的派生类对象,但派生特性将被剥去,因此将使用虚方法的基类版本。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • AI古风插画视频:成都亚恒丰创教育科技有限公司
  • 智启未来,共筑工业软件新梦 ——清华大学博士生天洑软件实习启航
  • 2-添加库
  • nodejs md文件转html
  • 如何在 Microsoft Edge 上使用开发人员工具
  • Spring Boot Vue 毕设系统讲解 3
  • 高效利用iCloud:释放你的数字生活
  • Spring框架Mvc(2)
  • jmeter-beanshell学习5-beanshell加减乘除运算
  • 推荐一款Win11主题WPF UI框架
  • Mysql 高性能索引
  • AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2024.07.01-2024.07.05
  • 使用pycuda + skcuda 遇到 OSError: CUDA runtime library not found 的解决方案
  • Python酷库之旅-第三方库Pandas(012)
  • Django QuerySet对象,exclude()方法
  • CentOS 7 防火墙操作
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • echarts花样作死的坑
  • FastReport在线报表设计器工作原理
  • isset在php5.6-和php7.0+的一些差异
  • JavaScript-Array类型
  • Java深入 - 深入理解Java集合
  • 后端_MYSQL
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​第20课 在Android Native开发中加入新的C++类
  • #Z0458. 树的中心2
  • (c语言)strcpy函数用法
  • (day6) 319. 灯泡开关
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (ZT)一个美国文科博士的YardLife
  • (二)丶RabbitMQ的六大核心
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (三分钟)速览传统边缘检测算子
  • (十三)Flask之特殊装饰器详解
  • (学习日记)2024.01.09
  • (转载)深入super,看Python如何解决钻石继承难题
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .Net OpenCVSharp生成灰度图和二值图
  • .Net 基于.Net8开发的一个Asp.Net Core Webapi小型易用框架
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .net知识和学习方法系列(二十一)CLR-枚举
  • 。Net下Windows服务程序开发疑惑
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • [383] 赎金信 js
  • [AIGC] Redis基础命令集详细介绍
  • [BUG]Datax写入数据到psql报不能序列化特殊字符
  • [bzoj2957]楼房重建
  • [C#]C#学习笔记-CIL和动态程序集
  • [C++] vector list 等容器的迭代器失效问题