C++ exception throw和catch的时候,发生了什么

原创 2006年05月24日 09:10:00


--------------  测试程序-----------------------------

#include <stdio.h>
#include <string.h>
#include <iostream>

int gi = 0;

class CA
{
public:
    CA(): mi(gi) { cout<< "CA" <<mi << " default constructor "<<endl;  gi++; }
    CA(const CA &oa) { mi = gi; cout<< "CA" <<mi << " copy constructor" <<endl; gi++;}
    ~CA() { cout<< "CA" <<mi << " destructor" <<endl; }
private:
    int mi;   
};


void fun()
{
    CA   oa;
    throw oa;
}

int main()
{
    try
    {
     cout<< "in try block "<<endl;
     fun(); 
    }
    catch( CA oa)
    {
        cout<<"catch" <<endl;
        oa.fun();
    }
    cout<<"after catch"<<endl;
    getchar();

   }

--------------  输出结果-----------------------------

in try block
CA0 default constructor
CA1 copy constructor
CA0 destructor
CA2 copy constructor
catch
CA2 fun() is called
CA2 destructor
CA1 destructor
after catch

--------------  结果分析-----------------------------

在throw oa的时候,发生了:
  编译器生成一个临时CA对象,并调用CA的copy constructor,类似于: CA oa_temp( oa );
  然后oa对象出来生存期,oa的destructor被调用。
 同时 oa_temp被作为catch的参数传递到catch 块中。
 在catch的时候,因为采用的by value传递参数,所以编译器又要生成一个临时CA对象,并发生一次copy constructor,类似于: CA oa_temp2 (  oa_temp  );
 在catch块中,使用的其实是oa_temp2,这个可以从结果“CA2 fun() is called”来判断出。
 最后,在出了catch块后,先是oa_temp2被析构,然后是oa_temp。
 
 从上可以,在by value throw 和by value catch的情况下,会发生
     3次构造函数调用,1次default constructor,2次copy constructor
     3次析构函数调用
 
--------------  心得 -----------------------------
   c++书籍中建议: throw by value , and catch by reference.
   如果catch by reference,我认为会发生2次构造函数调用,2次析构函数调用。少了一次copy constructor和一次对应的destructor。
   是不是如此,没有测试,因为我觉得肯定是这样的。

throw exception和 try catch的区别

1. 区别: throw exception直接终止方法,或者退出循环。 try catch还要继续处理方法余下的逻辑,或者不结束循环。 try catch 不中断,throw exceptio...

Java异常处理( try catch finally throw throws exception error)

Java异常处理机制当程序中抛出一个异常后,程序从程序中导致异常的代码处跳出,java虚拟机检测寻找和try关键字匹配的处理该异常的catch块,如果找到,将控制权交到catch块中的代码,然后继续往...

在catch块中throw new Exception的意义 .

throw new Exception(String, Exception) throw new Exception(String) throw是明确地抛出异常 MSDN:Exception...

C++ 异常 exception throw

之前很少用到C++的exception机制,看到C++ Primer的第6章,简要的介绍一下: 首先,C++ 的异常处理包括: throw表达式。如: #include #include using...

c++ 异常处理(try catch throw)、命名空间

一、c++工具 模板(函数模板、类模板)、异常处理、命名空间等功能是c++编译器的功能,语言本身不自带,这些功能已经成为ANSI C++标准了,建议所有的编译器都带这些功能,早期的c++是没有这些功能...

C++ Throw Try catch

要防止因为异常产生的内存泄漏,可以使用智能指针,也可以用 __try { } __finally { } 《Windows核心编程》一书第23~25章是很好的参考资料。 ————————...

C++处理异常技巧-try,catch,throw,finally

异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制。 也许我们已经使用过异常,但是你会是一种习惯吗,不要老是想着当我打开一个文件的时候才用异常判断一下,我知道对你来说你喜欢用r...

C++处理异常 try,catch,throw

内容导读: 本文包括2个大的异常实现概念:C++的标准异常和SHE异常。 C++标准异常:也许我们了解过他,但你有考虑过,其实你根本不会使用,你不相信,那我问你:垃圾回收在C++中怎么实现?其...
  • tgzjz
  • tgzjz
  • 2015年04月21日 11:16
  • 1481

c++ try_catch throw

try{} catch(…){}以前都是用try{} catch(…){}来捕获C++中一些意想不到的异常, 今天看了Winhack的帖子才知道,这种方法在VC中其实是靠不住的。例如下面的代码:try...

C/C++进阶学习笔记(三) 异常处理 try catch throw

本节介绍C++里面的异常处理
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ exception throw和catch的时候,发生了什么
举报原因:
原因补充:

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