More Effective C++:通过引用捕获异常

当你写一个catch子句时,必须确定让异常通过何种方式传递到catch子句里。你可以有三个选择:与你给函数传递参数一样,通过指针(by pointer),通过传值(by value)或通过引用(by reference)。

我们首先讨论通过指针方式捕获异常(catch by pointer)。从throw处传递一个异常到catch子句是一个缓慢的过程,在理论上这种方法的实现对于这个过程来说是效率最高的。因为在传递异常信息时,只有采用通过指针抛出异常的方法才能够做到不拷贝对象,例如:

class exception { ... }; // 来自标准C++库(STL)
 // 中的异常类层次
 void someFunction()
 {
  static exception ex; // 异常对象
  ...
  throw &ex; // 抛出一个指针,指向ex
  ...
 }
 void doSomething()
 {
  try {
   someFunction(); // 抛出一个 exception*
  }
  catch (exception *ex) { // 捕获 exception*;
   ... // 没有对象被拷贝
  }
 }


这看上去很不错,但是实际情况却不是这样。为了能让程序正常运行,程序员定义异常对象时必须确保当程序控制权离开抛出指针的函数后,对象还能够继续生存。全局与静态对象都能够做到这一点,但是程序员很容易忘记这个约束。如果真是如此的话,他们会这样写代码:

void someFunction()
{
 exception ex; // 局部异常对象;
 // 当退出函数的生存空间时
 // 这个对象将被释放。
 ...
 throw &ex; // 抛出一个指针,指向
 ... // 已被释放的对象
}


这简直糟糕透了,因为处理这个异常的catch子句接受到的指针,其指向的对象已经不再存在。

时间: 2024-11-03 23:18:31

More Effective C++:通过引用捕获异常的相关文章

More Effective C++之引用计数

Reference counting让我想起了Java,当如果想用C++来实现Java的能力的话,那Reference counting必不可少.Reference counting可以节省程序的运行成本,大量的构造.析构.分配.释放和拷贝的代价被省略. 实现 classRCObject { public: RCObject():refCount(0),shareable(true){} RCObject(constRCObject&):refCount(0),shareable(true){}

《Effective C++》读书笔记10:令operator=返回一个引用指向*this

一般的连锁赋值方式: int x, y, z; x = y = z = 15;//等价于x = (y = (z = 15)); 当我们要实现自己的operator=操作时,就需要返回一个引用,该引用指向了操作符左 侧的参数: 1 class Widget 2 { 3 public: 4 5 Widget& operator=(const Widget& rhs) 6 { 7 8 return *this;//返回*this 9 } 10 }; 这个*this是所以c++标准实现中的规范做法

More Effective C++:指针与引用的区别

指针与引用看上去完全不同(指针用操作符'*'和'->',引用使用操作符'.'),但是它们似乎有相同的功能.指针与引用都是让你间接引用其他对象.你如何决定在什么时候使用指针,在什么时候使用引用呢? 首先,要认识到在任何情况下都不能用指向空值的引用.一个引用必须总是指向某些对象.因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量.相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明

Effective C#原则23:避免返回内部类对象的引用

你已经知道,所谓的只读属性就是指调用者无法修改这个属性.不幸运的是 ,这并不是一直有效的.如果你创建了一个属性,它返回一个引用类型,那么调 用者就可以访问这个对象的公共成员,也包括修改这些属性的状态.例如: public class MyBusinessObject { // Read Only property providing access to a // private data member: private DataSet _ds; public DataSet Data { get

C++之:引用

一.概念 某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样. 引用的声明方法:类型标识符 &引用名=目标变量名: 二.引用的注意点 (1)&在此不是求地址运算符,而是起标识作用. (2)类型标识符是指目标变量的类型. (3)声明引用时,必须同时对其进行初始化. (4)引用声明完毕后,相当于目标变量有两个名称即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名. (5)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型

Effective Java -->(一)创建和销毁对象

创建|对象 Effective Java学习笔记JAVA语言支持四种基本类型:接口(Interface).类(Class).数组(Array).和原语类型(Primitive).前三种类型通常被称为引用类型(reference type),类的实例和数组是对象(object),而原语类型的值不是对象.一个类的成员(member)包括它的域(field),方法(method),成员类(member class)和成员接口(member interface).一个方法的原型(signature)包括

JavaScript捕获异常

javascript 中的捕获异常: 大家是不是觉得调试javascript非常的痛苦,我也觉得. 只要能找到一点可以帮助我们调试javascript的好方法我们都要用上. 其实javascript中也可以捕获异常的,比如: <div id='bbb' style="display:none">asdf</div> <script>     function a()     ...{         try         ...{         

《Effective C# 精髓》摘选

昨天买了一本<Effective C#>,看了几个Item,虽然没有当初读<Effective C++>时的那般震撼,但是也收获不少.把其中的要点记录于下,有些条款加上了自己的理解,权当作读书笔记吧 :-) Item 1: Always Use Properties Instead of Accessible Data Members 这个是地球人都知道的条款了.你需要记住,属性是类的外部接口部分,而(公共)成员却是内部实现.如果把内部实现暴露给外部,对于以后类的实现变更是非常不利

大话深入浅出Effective Java核心实战编程思想之猴王的把戏

不知道大家还记不记得在<西游记>里的莲花洞夺宝的故事,就是猴王巧夺宝物,收复金银角大王那 一章.到底这个故事给了我们什么启示呢?这故事又和Effective Java有什么联系?还是延续上篇文章的 风格吧,看代码,读故事. 1import static org.junit.Assert.*; 2import org.junit.Test; 3 4 5public class TestClone { 6 7 @Test 8 public void testClone(){ 9 // 西天取经的路