1.C语言的异常处理利用的是longjmp
longjmp 与goto的作用类似,但作用域差异很大。
longjmp不限于函数内部。
2.使用时需要使用c标准库中的setjmp.h
jmp_buf 是setjmp.h中定义的一个结构体
使用时,先实例化一个结构体
利用setjmp来进行赋值。setjmp返回0则实例化成功。
然后再利用longjmp进行对应的跳转。
跳转的到的地方即setjmp()的地方,其setjmp的返回值对应的就是longjmp的第二个参数。
2.举个例子:
#include<stdio.h>
#include<setjmp.h>
#include<stdlib.h>
jmp_buf errBuf;
void checkJmpFlag(int jmpFlag);
void sendErr();
int main(){
int jmpFlag=setjmp(errBuf);
checkJmpFlag(jmpFlag);
sendErr();
return 0;
}
void checkJmpFlag(int jmpFlag){
if(jmpFlag==0){
}
else{
printf("Error: JmpFlag");
exit(-1);
}
}
void sendErr(){
longjmp(errBuf,-5);
}
对应的输出如下
$ ./testLongJmp
Error: JmpFlag
3. 注意:
longjmp似乎只能向前跳转无法向后跳转。
对应的测试例子
#include<stdio.h>
#include<setjmp.h>
#include<stdlib.h>
jmp_buf errBuf;
void checkJmpFlag(int jmpFlag);
void sendErr();
int main(){
sendErr();
int jmpFlag=setjmp(errBuf);
checkJmpFlag(jmpFlag);
return 0;
}
void checkJmpFlag(int jmpFlag){
if(jmpFlag==0){
}
else{
printf("Error: JmpFlag");
exit(-1);
}
}
void sendErr(){
longjmp(errBuf,-5);
}
输出结果
$ ./testLongJmp