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