构造函数抛出异常

    构造函数抛出异常有两种:

    (1)一种是在初始化列表里抛出,这种情况应该捕获,进行回滚,然后系统自动上抛,在上层还应该catch一次。这时,构造未完成,故析构函数不被调用。

    (2)另一种是在函数体中抛出异常,这种系统是不会自动上抛的。这种情况构造已经完成,会调用析构函数。

    当然,最好是不要在构造函数里干太多事,大可以拿一个init函数来手动调用。。。

    测试:

#include <iostream>
using namespace std;
void f2();
void f1();

class X 
{
public:

	X()
	{
		try
	    {
            cout<<"X()"<<endl;
	        throw 1;
	    }
	    catch(...)
	    {
	        cout<<"X() catch"<<endl;
	    }
	}
	
	X(int x)try
    {
        cout<<"X(int)"<<endl;
	    throw 1;   
	}
	catch(...)
	{
	    cout<<"X(int) catch"<<endl;
	}
	
	
    ~X() 
    {
	    cout << "~X\n";
         
    }
};

int main()
{
///1
  cout<<"1"<<endl;
  try 
  {
    X x(1);
  }
  catch(...)
  {
    cout<<"main catch"<<endl;
  }
  
  cout<<"2"<<endl;
///2
  try 
  {
    X x;
  }
  catch(...)
  {
    cout<<"main catch"<<endl;
  }
  
  
  cout<<"f1"<<endl;
  f1();
  cout<<"f2"<<endl;
  f2();


}



/

void f2()
try
{
    throw 1;
}
catch(...)
{
    cout<<"f2:catch"<<endl;
}

void f1()
{
    try
    {
        throw 1;
    }
    catch(...)
    {
        cout<<"f1:catch"<<endl;
    }
}


chen@chen-book1:~$ g++ d.cpp -o d
chen@chen-book1:~$ ./d
1
X(int)
X(int) catch
main catch
2
X()
X() catch
~X
f1
f1:catch
f2
f2:catch


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值