首页 > 其他分享 >01 | C语言异常处理(jmp_buf、setjmp、longjmp)

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

时间:2023-04-10 15:36:56浏览次数:43  
标签:01 longjmp int jmp setjmp printf 异常 jumper

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

标签:01,longjmp,int,jmp,setjmp,printf,异常,jumper
From: https://www.cnblogs.com/mmxingye/p/17303028.html

相关文章

  • L3-017 森森快递(天梯赛)
    https://pintia.cn/problem-sets/994805046380707840/exam/problems/994805047638999040大意是在一条直线上,有N个从0..N-1编号的城市,每个城市之间的道路有最大负载ai,现在有M张从i城到j城的运货订单,假设每个城市的货物无限,问在某一时刻,如何安排订单的运输,能使得运输的货物重......
  • 2 01 | 是什么推动了单体应用到微服务架构的演进?
    你好,我是姚秋辰。“微服务”是近些年在大型应用架构领域的一个热门话题,从实践领域来看,我们身边的一二线大厂也纷纷选择全面拥抱微服务。就拿国内Java系的一线大厂来说,如阿里系、美团点评、PDD等,它们都将自己的核心业务系统构建在微服务架构之上。即便你是刚参加工作的萌新,也一......
  • 01背包和完全背包
    01背包内层循环应从大到小完全背包内层循环应从小到大背包问题一般外层循环为物品,内层循环为背包对01背包来说可以交换顺序对于完全背包来说不可交换顺序,如在力扣518零钱兑换Ⅱ中,外层循环为物品,内层循环为背包求的是组合数;外层循环为背包,内层循环为物品求的是排列数。......
  • GhostDoc Enterprise.v2022.2.22190.VS2017-VS2022.Extension安装包分享
    这个网站似乎是屏蔽了中国大陆和中国香港的IP,不知道怎么想的。似乎是有点看不起我们?原版安装包v2022.2.22190,支持vs2017到vs2022,可以通过百度网盘下载。链接:https://pan.baidu.com/s/13hrjHHn_51RDUMiIcylu-A?pwd=dxym提取码:dxym -------------------------------------......
  • VS2019使用C语言进行websocket编程
    一直在写C#代码好多年不写C语言代码了,记录一下之前某个项目里用C写的一个websocket服务,用C的优势是写的东西体积小性能高,但是写业务的话还得用C#、Java之类的语言,不然会折腾死人。。。 用VisualStudio新建一个C++(因为不能直接建C语言项目)项目,我演示就创建一个控制台项目。项......
  • VS2013关闭调试而不关闭IIS Express
    在VS主面板打开:工具->选项->调试->编辑继续   取消选中[启用"编辑并继续"] 就OK了(英文版的请对应相应的操作)不过这是针对所有的调试,如果你想针对单个项目就还是保留VS的设置,直接去项目属性里设置在你的Web项目上右键->属性->Web 取消选中[启用"编辑并继续"] 就OK了......
  • 庄懂的技术美术入门01笔记
    前言:unity的全英文对我真的是劝退XD这算是真正意义上的第一篇博客,是以笔记的形式,主要是怕自己忘了,或许之后不定时还会对笔记内容进行总结再水一篇1.一般简单的渲染过程模型——输入结构——顶点shader——输出结构——像素shader——渲染结果①模型——输入结构将原模型转化......
  • buuctf.crypto.NCTF2019]childRSA
    预期解法Pollard'sp-1method题目fromrandomimportchoicefromCrypto.Util.numberimportisPrime,sieve_baseasprimesfromflagimportflagdefgetPrime(bits):whileTrue:n=2whilen.bit_length()<bits:n*=cho......
  • 401 数字三角形 记忆化搜索
    视频链接:https://www.bilibili.com/video/BV16V411U7Gc/LuoguP1216[USACO1.5][IOI1994]数字三角形NumberTriangles#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;constintN=1005;intn,a[N][N],f[N][N];intdfs(......
  • [oeasy]python0131_[趣味拓展]各种符号_汉语拼音符号_中文全角英文字母_中文全角标点
    各种符号回忆上次内容中文字符可以有各种分类方法声母拼音检字法韵母合辙押韵的分类偏旁部首实际上unicode的排序方法我们以前勇闯地下城时候获得了一把屠龙宝刀给他镶上了❤️宝石这宝石应该如何理解?今天我们就来彻底解密红色爱心的原理闭环首先是文字我们的汉字可以构成一个闭......