我是靠谱客的博主 甜美奇迹,最近开发中收集的这篇文章主要介绍C/C++编程:通过引用捕获异常通过指针方式捕获异常通过值方式捕获异常通过引用方式捕获异常,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

当你写一个catch子句时,必须确定让异常通过何种方式传递到catch子句里。跟函数传参一样,有三种选择:指针、引用、传值

 

通过指针方式捕获异常

从throw处传递一个异常到catch子句是一个缓慢的过程,理论上这种方法对这个过程是效率最高的。因为在传递异常信息时,只有通过采用指针抛出异常的方法才能做到不拷贝对象:

class exception{...} ; // 来自STL的异常类层次

void someFunction(){

    static exception ex;   //异常对象
    ...
    throw &ex;             //抛出一个指针,指向ex
}

void doSomething(){

    try{

        someFunction();   //抛出一个exception*
    }catch(exception *ex){  //捕获exception*,没有对象被拷贝

    }
}

但是上面程序有一个很大的缺点:为了让程序正常允许,异常对必须能够确保当程序控制权抛出函数指针之后,对象还能继续生存。如果忘记了这个原始,catch子句接受到的指针,其指向的对象已经不存在

void someFunction(){

    exception ex;         //局部对象,当推出函数时这个对象将被释放
    ...
    throw &ex;             //抛出一个指针,指向一个已经被释放的对象
}

另一个抛出指针的方法是建立一个堆对象

void someFunction(){
    throw new exception;           
}

但是catch子句又将面临新的问题:这个指针到底是不是堆对象,要不要删除它?如果是堆对象而没有被删除,将导致资源泄漏;如果不是堆对象却去删除,将导致程序死掉(或者其他未定义行为)

而且,通过指针捕获异常也不符合C++语言本身的规范。四个标准的异常

  • bad_alloc(当operator new不能分配足够内存时抛出)
  • bad_cast(当dynamic_cast针对一个引用槽时失败时抛出)
  • bad_typeid(当dynamic_cast对空指针进行操作时抛出)
  • bad_exception(用于unexpected异常)

--- 都不是指向对象的指针,所以你必须通过值或者引用来捕获它们

 

通过值方式捕获异常

通过值捕获可以解决上面的问题,但是它也有自己的问题:

  • 当它们被抛出时系统将对异常对象拷贝两次
  • 会删除slicing problem,即派生类的异常对象被作为基类异常对象捕获时,它的派生类行为就被切割掉了。这样的sliced实际上时一个基类对象:它们没有派生类的数据对象,而且当调用它们的虚函数时,系统解析后调用的时基类对象的函数(当对象通过传值方式传递给指针时,也会发生切割问题)

通过引用方式捕获异常

通过引用捕获可以解决上面所有问题

  • 不会有对象删除问题
  • 没有slicing problem,而且异常对象只被调用一次

 

最后

以上就是甜美奇迹为你收集整理的C/C++编程:通过引用捕获异常通过指针方式捕获异常通过值方式捕获异常通过引用方式捕获异常的全部内容,希望文章能够帮你解决C/C++编程:通过引用捕获异常通过指针方式捕获异常通过值方式捕获异常通过引用方式捕获异常所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部