C语言setjmp()和longjmp()实现异常处理机制。
setjmp() 用于保存当前的程序执行状态。
longjmp() 用于在后面的某个时刻返回到setjmp()点的状态。
类似goto。但goto是本地的,只能在函数内部跳转。
setjmp()和longjmp()是非局部跳转语句,可在调用栈上,返回到调用路径上的某一个函数中。
头文件<setjmp.h>
#include <stdio.h>
#include <setjmp.h>
static jmp_buf buf;
void otherfunction(void) {
printf("some error\n");
longjmp(buf,1); // 跳回setjmp的调用处 - 使得setjmp返回值为1
}
void deal(void) {
otherfunction();
printf("deal done\n");
}
int main() {
if ( ! setjmp(buf) ) { // 设置成功,第一次返回0,longjmp后返回1
deal();
} else {
printf("catch error\n");
}
return 0;
}
输出
some error
catch error
在C++中,setjmp 和 longjmp 通常不被推荐使用。
因为C++提供了更强大和类型安全的异常处理机制,即 try, catch, 和 throw 关键字。这些关键字允许你在代码中定义异常处理块,并在需要时抛出异常,由相应的 catch 块捕获并处理。