条款十三:以by reference方式捕获异常

来源:互联网 发布:rc4算法 c语言实现 编辑:程序博客网 时间:2024/05/17 02:13

条款十三:以by reference方式捕获异常

1. 传址

  异常处理时该如何选择使用传值,传址,传引用;传址不会发生对象的复制,这相对于传值来说性能方面要优越不少,但是传址又会衍生很多问题,比如传址不能传递一个局部的指针,这样离开作用域对象被销毁指针会失效,当然,可以使用传递全局变量或者静态变量来消除这些问题,但是全局变量和静态变量的销毁也是一个问题。可能你想使用throw new execption;来解决问题但是这样抛出的指针你什么时候销毁,该不该销毁又是一个很头疼的问题。

  另外,语言中有一些惯例,比如:bad_alloc,bad_cast,bad_typeid,bad_exception诠释对象,不能用传址来捕获。

2. 传值

  传值不存在传址中存在的诸多问题,不用考虑何时进行对象的销毁,但是传值有两个很严重的缺点:1.传值会在发生异常时进行自动的拷贝对象,造成较高的资源耗费;2.传值在面对继承类问题时比较尴尬,会发生对象的切片,子类对象会丢失对应的子类数据和成员函数,多态机制也会失效。比如:

class exception               //这是一个标准的execption类{public:    virtual const char* what() throw();};class user_execption:public exexption{public:    virtual const char* what() throw();};void fun(void){       try    {        throw user_exception;    }    catch(execption w)    {        //TODO:        std::cout<<w.what()<<std::endl;    }}

  上述代码中用户catch可以接受用户创建的类的异常,但是user_exception会被切片,失去对应的成员函数和数据,只保留父类的成员;当调用what函数时多态不再适用,而是调用父类的what,这回导致异常类型处理的错误。

3. 传引用

  当使用引用时以上问题都不存在,而且对象只会被复制一次,相对于使用传址的安全性和传值造成的对象切片相对来说要好得多。
  
  在异常处理时尽量使用传引用,可以避免很多问题!

0 0