01 | C语言异常处理(jmp_buf、setjmp、longjmp)
首先说明,C语言中的异常处理主要还是 错误码的思路.
其次,C语言中是有 返回两次的函数的 ,比如说 fork()函数
在 C 语言中是没有 try catch
块的,但并不代表没有异常处理。
接下来我们简单明确三个概念,最后来一个简单的小例子。
1.三个概念
- 使用一个
jmp_buf
的类型变量来充当异常码的载体。 - 通过
longjmp()
来给载体赋异常码。 - 通过
setjmp()
提取出异常码
2.一个例子
#include <stdio.h>
#include <setjmp.h>
#include <iostream>
jmp_buf jumper;
int mdiv(int a, int b) {
if (b == 0) { // can't divide by 0
longjmp(jumper, -3);//跳到以jumper 所在的jmp point,进行处理,-3 相当于具体的exception code.
}
return a / b;
}
int main() {
int jstatus = setjmp(jumper);//相当于java catch,如果发生 jumper 异常,那么会跳回到这个jmp point
if (jstatus == 0) {//第一次执行的时候是正确的setjmp return 0.
int a = 3;
int b = 1;
printf("%d/%d", a, b);
int result = mdiv(a, b);
printf("=%d\n", result);
}
else if (jstatus == -3)
printf(" --> Error:divide by zero\n");
else
printf("Unhandled Error Case");
system("pause");
return 0;
}