异常的Rethrow分析

原创 2006年06月03日 20:53:00
网上看了一篇类似的分析,仔细看了一下写的不错,现在把代码引用一下:
try
       {
              try
              {

                     // 抛出一个异常对象

                     throw MyException("ex_obj1");

              }

              // 异常对象按值传递

              catch(MyException e)

              {
                     cout<<endl<<"捕获到一个MyException*类型的异常,名称为:"<<e.GetName()<<endl;
                     cout<<"下面重新抛出异常"<<endl<<endl;
                     // 异常对象重新被抛出
                     throw;
              }
       }

       // 异常对象再次按值传递

       catch(MyException e)

       {
              cout<<endl<<"捕获到一个MyException*类型的异常,名称为:"<<e.GetName()<<endl;
       }
这个地方异常作了四次构造,这四次构造分别称为obj1,obj2,obj3,obj4。逐一道来。

throw MyException("ex_obj1");看看这段代码。好像有一句话说,捕获的所有异常,永远不是异常对象本身。为什么这么说?MyException("ex_obj1")是构造了一个局部变量,但是这个局部变量被throw出去后会生成一个临时变量,我们所catch到的不是这个对象本身,而是这个临时对象。这个临时对象本身并没有什么,但却非常重要。因为rethrow是这个临时对象,而不是用值传递生成的新对象。所以用值传递的方式,不能将修改带到下一个catch块。后面两个catch就是obj3和obj4了,以后就不用想什么,对obj3和obj4所做的任何动作不会带到下一步,因为重新抛出的是obj2。

其实异常抛出很简单的,用引用传递就可以了。使用引用传递的好处就是每次catch都可以做点小动作。呵呵!

相关文章推荐

C++异常rethrow【转】

转自 http://se.csai.cn/ExpertEyes/200801031114531905.htm 在相遇篇中的《第5集 C++的异常rethrow》文章中,已经比较详细...
  • fall221
  • fall221
  • 2013年06月24日 22:01
  • 1702

Swift异常处理:throw和rethrow

Swift异常处理体现了函数式语言的特性,因此我们可以传一个会抛出异常的函数闭包(高阶函数)作为参数传到另一个函数中(父函数),父函数可以在子函数抛出异常时直接向上抛出异常,这时用rethrow关键字...
  • offbye
  • offbye
  • 2016年03月15日 19:00
  • 3833

Linux_的异常处理 很强大的分析

  • 2012年09月04日 12:59
  • 1.25MB
  • 下载

异常机制分析

  • 2012年10月31日 21:52
  • 635KB
  • 下载

Java Mysql连接池配置和案例分析--超时异常和处理

最近在开发服务的时候, 发现服务只要一段时间不用, 下次首次访问总是失败. 该问题影响虽不大, 但终究影响用户体验. 观察日志后发现, mysql连接因长时间空闲而被关闭, 使用时没有死链检测机制, ...

spring事务常见问题、异常分析和解决方法

1.spring事务超时transaction unexpectedly rolled back (maybe due to a timeout); nested exception is javax...

java 与c++的异常分析

  • 2014年04月25日 10:07
  • 31KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:异常的Rethrow分析
举报原因:
原因补充:

(最多只允许输入30个字)