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; }
分类:
C++ / C++异常
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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:字面量、静态断言和成员函数说明符