虽然throw-catch机制类似于函数参数和函数返回机制,但是还是有些不同之处。

其中之一是函数fun()中的返回语句将控制权返回到调用fun()的函数A中,

但throw语句将控制权向上返回到第一个这样的函数:包含能够捕获相应异常的try-catch组合。

另一个不同之处是,引发异常时,编译器总是创建一个临时拷贝,即使异常规范和catch块中指定的是引用。

请看下列代码

class problem {...}

...

void super() throw(problem)

{

...

if(oh_no)

{

problem oops;   //construct object

throw opps;       //throw it

...

}

...

tyr{

super();

}

catch(problem & p)

{

//statements

}

此时p将指向oops的副本而不是oops本身。这是件好事,因为super()执行完毕后,oops将不复存在。

另外:将引发异常和创建对象组合在一起会更加简单

throw problem();

将引用作为返回值的通常原因是避免创建副本以提高效率。那么既然throw语句将生成副本,为何代码中使用引用呢?

答案是,引用还有另外一个重要特征:基类引用可以执行派生类对象。

假设有一组通过继承关联起来的异常类型,则在异常规范中只需列出一个基类引用,它将与任何派生类对象匹配。

假设有一个异常类层次结构,并要分别处理不同的异常类型,则使用基类引用将能够捕获任何异常对象。

而使用派生类对象只能捕获它所属类及从这个类派生而来的类的对象。

引发异常对象将被第一个与之匹配的catch块捕获。这意味着catch块的排列顺序应该与派生顺序相反。

class bad_1 {...};

class bad_2 : public bad_1 {...};

class bad_3 : public bad_2 {...};

...

void duper()

{

...

if(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_3放在最前面,它将捕获bad_1、bad_2和bad_3;

通过按照相反的顺序排列,bad_3异常将被bad_3 &处理程序所捕获。

通过正确地安排catch块的顺序,让您能够在如何处理异常方面有选择的余地。

有时候可能不知道会发生哪些异常,在这种情况下,仍能捕获异常,即使不知道异常的类型。

方法是使用省略号来表示异常类型,从而捕获任何异常:

catch { ... }

可以将这个放在最后,有点像switch中的default。

C++_异常6-其他异常特性的更多相关文章

  1. cc38b_demo_C++_异常_(2)txwtech在异常中使用虚函数-多态

    //cc38b_demo,21days_C++_异常_(2)txwtech20200121在异常中使用虚函数-多态 //--异常层次结构//*异常的类-创建自己的异常类//*异常派生-就是继承//*异 ...

  2. 第25章 SEH结构化异常处理_未处理异常及向量化异常

    25.1 UnhandledExceptionFilter函数详解 25.1.1 BaseProcessStart伪代码(Kernel32内部) void BaseProcessStart(PVOID ...

  3. 第24章 SEH结构化异常处理_异常处理及软件异常

    24.1  程序的结构 (1)try/except框架 __try{ //被保护的代码块 …… } __except(except fileter/*异常过滤程序*/){ //异常处理程序 } (2) ...

  4. Java精选笔记_面向对象(多态、异常)

    多态 概述 可以理解为事物存在的多种体现形态.同样的引用调用同样的方法却做了不同的事情 多态的本质是:一个程序中同名的不同方法. 多态的体现 父类的引用指向子类的对象,父类的引用接收子类的对象. 多态 ...

  5. JAVA中的异常及处理异常的方法

    异常 这是我老师的喜好:就是说一上来就拿一张图给大家看看,过过瘾-_- 这是一张: 异常分类图 来,这里还有一张带中文的常见异常截图!!! 1:先来说说什么是异常吧: 其实就是"阻止当前方法 ...

  6. PLSQL_Oracle Exception异常分类、异常抛出、异常处理、异常传播(概念)

    2014-06-03 Created By BaoXinjian

  7. Windows核心编程 第25章 未处理异常和C ++异常(下)

    这一节东西比较少,本应该归并在上一节里,但是昨天太晚了.就先把那些东西分为上了.这节里面就一个问题,C++异常与结构性异常的对比(try和__try的区别): C++异常与结构性异常的对比 S E H ...

  8. Windows核心编程 第2 5章 未处理异常和C ++异常(上)

    未处理异常和C + +异常(上) 前一章讨论了当一个异常过滤器返回 E X C E P T I O N _ C O N T I N U E _ S E A R C H时会发生什么事情.返回EXCEPT ...

  9. 基础知识《十》unchecked异常和checked异常

    运行时异常在运行期间才能被检查出来,一般运行期异常不需要处理.也称为unchecked异常.Checked异常在编译时就能确定,Checked异常需要自己处理. checked 异常也就是我们经常遇到 ...

  10. Java异常(一) Java异常简介及其架构

    概要 本章对Java中的异常进行介绍.内容包括:Java异常简介Java异常框架 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3544168.html ...

随机推荐

  1. Gym 101350G - Snake Rana

    题意 有一个n*m的矩形,里面有k个炸弹,给出每个炸弹的坐标,计算在n*m的矩形中有多少子矩形内是不包含炸弹的. 分析 场上很是懵逼,赛后问学长说是容斥定理?一脸懵逼..容斥不是初中奥数用在集合上的东 ...

  2. Python 网络爬虫 010 (高级功能) 解析 robots.txt 文件

    解析 robots.txt 文件 使用的系统:Windows 10 64位 Python 语言版本:Python 2.7.10 V 使用的编程 Python 的集成开发环境:PyCharm 2016 ...

  3. PC建立WIFI热点

    netsh wlan set hostednetwork ssid=test key =12345678netsh wlan start hostednetwork

  4. Linux bind-utils

    一.简介 DNS是一种将域名解析为IP地址的服务.如:www.turbolinux.com.cn通过DNS解析,可以得到210.77.38.126.bind是linux系统下的一个DNS服务程序.bi ...

  5. 4.SELECT DISTINCT 语句

    在表中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值. 关键词 DISTINCT 用于返回唯一不同的值. 语法: SELECT DISTINCT 列名称 F ...

  6. 用conda创建一个tensorflow 虚拟环境

    创建your——user——name = tensorflow 的虚拟环境 xinpingdeMacBook-Pro:~ xinpingbao$ conda create -n tensorflow ...

  7. laravel实现多对多的分析

    在实际开发中多对多的开发还是比较常见的 1.1首先由migrate来创建表(文章表) 1.2同理创建标签表 1.3这是 我会的到如下结果: 2.1在数据迁移表contents中添加几个字段 publi ...

  8. 黑盒测试实践--Day6 11.30

    黑盒测试实践--Day6 11.30 今天完成任务情况: 应用设计的场景用例,完成测试用例的编写 完成测试用例在自动化测试工具QTP上的测试 分析测试结果得到缺陷报告 小靳 软件测试 今天主要钻研了q ...

  9. bootstrap实现嵌套列

    <!DOCTYPE html> <html> <head> <title>Bootstrap 实例 - 嵌套列</title> <li ...

  10. POJ1062 昂贵的聘礼(带限制的spfa)

    Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低 ...