用c语言中的setjmp和longjmp模拟try—catch异常机制

setjmp和longjmp定义在setjmp.h头文件中。原型为:

int setjmp(jmp_buf);

void longjmp(jmp_buf, int val);

当setjmp第一次被调用时,返回0;当longjmp以同样的jmp_buf变量被调用时,setjmp返回longjmp的第二个参数。

longjmp引发异常,setjmp实例化一个异常处理程序。

(1)基本的TRY-CATCH异常机制:

#include<setjmp.h>
#include<stdio.h>
#define TRY do{jmp_buf buf;if(!setjmp(buf)){
#define CATCH  } else{
#define END_TRY } }while(0)
#define THROW longjmp(buf,1)
void main()
{
 TRY
 {
      printf("in try statement\n");
      THROW;
      printf("do not appera\n");
 }
 CATCH
 {
      printf("get exception\n");
 }
     END_TRY;
}

输出

in try statement
get exception

(2)处理多个异常。用switch语句替换if语句,实现处理多个异常。

#include<setjmp.h>
#include<stdio.h>
#define TRY do{ jmp_buf buf; switch(setjmp(buf)) {case 0:
#define CATCH(x) break; case x:
#define END_TRY  } }while(0)
#define THROW(x) longjmp(buf,x)
#define error1 (1)
#define error2 (2)
#define error3 (3)
void main()
{
 TRY
 {
  printf("in try statement\n");
  THROW(error2);
  printf("do not appear\n");
 }
 CATCH(error1)
 {
  printf("get error1\n");
 }
 CATCH(error2)
 {
  printf("get error2\n");
 }
 CATCH(error3)
 {
  printf("get error3\n");
 }
 END_TRY;
}

输出:

in try statement
get error2


(3)tyr-catch-finally机制

#include<setjmp.h>
#include<stdio.h>
#define TRY do{ jmp_buf buf; switch(setjmp(buf)) {case 0: while(1){
#define CATCH(x) break;case x:
#define FINALLY break; } default:
#define END_TRY } }while(0);
#define THROW(x) longjmp(buf,x)
#define error1 (1)
#define error2 (2)
#define error3 (3)

void main()
{
 TRY
 {
  printf("in try statement\n");
  THROW(error3);
  printf("do not appear\n");
 }
 CATCH(error1)
 {
  printf("get error1\n");
 }
 CATCH(error2)
 {
  printf("get error2\n");
 }
 CATCH(error3)
 {
  printf("get error3\n");
 }
 FINALLY
 {
  printf("must appear\n");
 }
 END_TRY;
}

输出:

in try statement
get error3
must appear

 

详细用法见http://www.di.unipi.it/~nids/docs/longjump_try_trow_catch.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值