当前位置: 代码迷 >> 综合 >> C异常处理方法
  详细解决方案

C异常处理方法

热度:88   发布时间:2023-10-29 03:48:28.0

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

  相关解决方案