01 | C语言异常处理(jmp_buf、setjmp、longjmp)

发布时间 2023-04-10 15:24:13作者: 独立树

首先说明,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;
}