mmxingye

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

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;
}

posted on   独立树  阅读(244)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
历史上的今天:
2022-04-10 10 | 到底应不应该返回对象?
2022-04-10 09 | 易用性改进 II:字面量、静态断言和成员函数说明符
点击右上角即可分享
微信分享提示