C++_异常6-其他异常特性
虽然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-其他异常特性的更多相关文章
- cc38b_demo_C++_异常_(2)txwtech在异常中使用虚函数-多态
//cc38b_demo,21days_C++_异常_(2)txwtech20200121在异常中使用虚函数-多态 //--异常层次结构//*异常的类-创建自己的异常类//*异常派生-就是继承//*异 ...
- 第25章 SEH结构化异常处理_未处理异常及向量化异常
25.1 UnhandledExceptionFilter函数详解 25.1.1 BaseProcessStart伪代码(Kernel32内部) void BaseProcessStart(PVOID ...
- 第24章 SEH结构化异常处理_异常处理及软件异常
24.1 程序的结构 (1)try/except框架 __try{ //被保护的代码块 …… } __except(except fileter/*异常过滤程序*/){ //异常处理程序 } (2) ...
- Java精选笔记_面向对象(多态、异常)
多态 概述 可以理解为事物存在的多种体现形态.同样的引用调用同样的方法却做了不同的事情 多态的本质是:一个程序中同名的不同方法. 多态的体现 父类的引用指向子类的对象,父类的引用接收子类的对象. 多态 ...
- JAVA中的异常及处理异常的方法
异常 这是我老师的喜好:就是说一上来就拿一张图给大家看看,过过瘾-_- 这是一张: 异常分类图 来,这里还有一张带中文的常见异常截图!!! 1:先来说说什么是异常吧: 其实就是"阻止当前方法 ...
- PLSQL_Oracle Exception异常分类、异常抛出、异常处理、异常传播(概念)
2014-06-03 Created By BaoXinjian
- Windows核心编程 第25章 未处理异常和C ++异常(下)
这一节东西比较少,本应该归并在上一节里,但是昨天太晚了.就先把那些东西分为上了.这节里面就一个问题,C++异常与结构性异常的对比(try和__try的区别): C++异常与结构性异常的对比 S E H ...
- 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 ...
- 基础知识《十》unchecked异常和checked异常
运行时异常在运行期间才能被检查出来,一般运行期异常不需要处理.也称为unchecked异常.Checked异常在编译时就能确定,Checked异常需要自己处理. checked 异常也就是我们经常遇到 ...
- Java异常(一) Java异常简介及其架构
概要 本章对Java中的异常进行介绍.内容包括:Java异常简介Java异常框架 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3544168.html ...
随机推荐
- 一个由有符号下标引起的bug
先看段代码: if(s[d[i]]) { ... } 这里的d是一个char*的内存buffer,s是一个256长度的bool数组.上段代码逻辑是,s已进行过初始化,其作用是过滤字节,有些字节对应tr ...
- Linux 下五款出色的流媒体客户端
数 字流媒体这几天几乎占据了我音乐收听的全部时间.近年来我为了收藏 CD 花费了数量可观的费用:但它们中的大部分现在正静静地躺在满是灰尘的角落里.基本上所有的音乐流媒体服务所提供的的音质都不如 CD ...
- Makefile 编写规则 - 1
Makefilen内容 1. 显示规则:显示规则说明了,如何生成一个或多个目标.这是由Makefile指出要生成的文件和文件依赖的文件.2. 隐晦规则:基于Makefile的自动推导功能3. 变量的定 ...
- SpringMVC——异常处理
Spring MVC 通过 HandlerExceptionResolver 处理程序的异常,包括 Handler 映射.数据绑定以及目标方法执行时发生的异常. SpringMVC 提供的 Handl ...
- The user specified as a definer (”@sa’%') does not exist 解决方法
mysql数据库报错The user specified as a definer (”@sa’%') does not exist.尝试过两种方式,第一种重启之后好用,但是一会就又不好用了.第二种算 ...
- 现代C++学习笔记之二入门篇2,数据转换
static_cast: 这种强制转换只会在编译时检查. 如果编译器检测到您尝试强制转换完全不兼容的类型,则static_cast会返回错误. 您还可以使用它在基类指针和派生类指针之间强制转换, ...
- HDU 3723 Delta Wave (高精度+calelan数)
题意:给定一个图,问你只能向上向下,或者平着走,有多少种方法可以走到最后一个格. 析:首先先考虑,如果没有平的情况就是calelan数了,现在有平的情况,那么就枚举呗,因为数很大,所以要用高精度. 答 ...
- postfix 安装配置详解
[ref: http://blog.51yip.com/server/1382.html] [http://blog.chinaunix.net/uid-174325-id-1744019.html] ...
- ToastUtils
public class ToastUtils { private static String TAG="ToastUtils"; private static Toast toa ...
- ajax 跨域名调用
在ajax 中要跨域名 请求的时候要注意 1. dataType: 'jsonp', 2. jsonp: 'callback', <script type="text/javascri ...