c++异常处理例子分析——有关setjmp()/longjmp()

/*
 * nonlocal.cpp
 *
 *  Created on: 2013-5-30
 *      Author: msm
 */
#include <iostream>
#include<csetjmp>


using namespace std;


class Rainbow{
public:
Rainbow(){cout << "Rainbow()"<<endl;}
~Rainbow(){cout << "~Rainbow()"<< endl;}
};
jmp_buf kansas;//初始化变量kansas,存储与处理器有关的状态信息;


void oz(){
Rainbow rb;
for(int i = 0 ; i < 3 ; i ++){
cout<< "there is no place like home"<<endl;
longjmp(kansas,47);
}
}
int main(){
if(setjmp(kansas) == 0){//----------------1
cout<< "tronado"<<endl;
oz();
}else{
cout<<"Auntie em!"<<endl;
}
}
//此处的setjmp()函数将所有与当前处理器相关的状态信息保存到jmp_buf中,

//在函数oz()中longjmp()调用,此时会返回到调用setjmp的地方(即1处),此时返回值为第二个参数即47;

//不满足条件,执行else

//处理结果:

/*tronado
Rainbow()
there is no place like home
Auntie em!*/


/*
 * Nonlocal.cpp
 *
 *  Created on: 2013-5-30
 *      Author: msm
 */
#include <iostream>
using namespace std;


class Rainbow{
public:
Rainbow(){cout<< "rainbow()"<<endl;}
~Rainbow(){cout<< "~rainbow()"<<endl;}
};
void oz(){
Rainbow rb;
for(int i = 0; i < 3;i++)
cout<< "there is no place like home!"<<endl;
throw 47;
}


int main(){
try{
cout<< "tornado"<<endl;
oz();
}catch(int){
cout << "Auntie Em!"<< endl;
}
}
//与前一个类似,不过是完整的调用了析构函数;


//结果:
/*tornado
rainbow()
there is no place like home!
there is no place like home!
there is no place like home!
~rainbow()
Auntie Em!
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值