c语言 异常捕捉 setjmp & longjmp
来源:互联网 发布:大数据分析算法及模型 编辑:程序博客网 时间:2024/06/05 07:28
此文是学习 C专家编程 中的笔记。
setjmp和longjmp是C语言所独有的,它们部分弥补了C语言有限的转移能力。
函数说明(来自wiki百科):
int setjmp(jmp_buf env)
建立本地的jmp_buf
缓冲区并且初始化,用于将来跳转回此处。这个子程序保存程序的调用环境于env
参数所指的缓冲区,env
将被longjmp
使用。如果是从setjmp
直接调用返回,setjmp
返回值为0。如果是从longjmp
恢复的程序调用环境返回,setjmp
返回非零值。void longjmp(jmp_buf env, int value)
恢复env
所指的缓冲区中的程序调用环境上下文,env
所指缓冲区的内容是由setjmp
子程序调用所保存。value
的值从longjmp
传递给setjmp
。longjmp
完成后,程序从对应的setjmp
调用处继续执行,如同setjmp
调用刚刚完成。如果value
传递给longjmp
零值,setjmp
的返回值为1;否则,setjmp
的返回值为value
。当使用longjmp的时候,j的内容被销毁。
这种方法看起来与goto相似,但是是有区别的,区别如下:
(1)goto语句不能跳出C语言当前的函数。
(2)用longjmp只能跳回曾经到过的地方。在执行setjmp的地方仍留有一个过程活动记录。从这个角度上讲,longjmp更象是“从何处来”,而不是“要往哪去”。另外,longjmp接受一个额外的整形参数并返回它的值,这可以知道是由longjmp转移到这里的还是从上一条语句执行后自然执行到这里的。
示例代码:
- #include <stdio.h>
- #include <setjmp.h>
- jmp_buf buf;
- void test_longjmp(void)
- {
- printf("test_longjmp() \n");
- longjmp(buf, 1);
- printf("end test_longjmp()\n");
- }
- void main(void)
- {
- if(setjmp(buf))
- printf("back test_longjmp");
- else
- {
- printf("first time to setjmp \n");
- test_longjmp();
- }
- }
因为,在test_longjmp中执行了longjmp方法,所以该示例中不会执行到“end test_longjmp()”处。
setjmp/longjmp的最大的用途是错误处理,只要还没有从函数中返回,一旦发现一个不可恢复的错误,可以把控制转移到主输入循环,并从那里重新开始执行。
C++中的异常处理机制"catch"和"throw"与其类似。
0 0
- c语言 异常捕捉 setjmp & longjmp
- C语言实现异常机制setjmp() longjmp()
- C语言下的setjmp longjmp(C 语言异常处理)
- 全面了解setjmp与longjmp(C语言异常处理机制)
- C语言异常处理机制, setjmp() and longjmp()
- C语言 控制转移 异常处理机制 setjmp & longjmp
- 全面了解setjmp与longjmp(C语言异常处理机制)
- c语言异常处理之longjmp 和 setjmp
- C语言异常处理——setjmp & longjmp
- C语言中利用setjmp和longjmp做异常处理
- c语言中的异常处理,setjmp 与 longjmp函数
- C语言中利用setjmp和longjmp做异常处理
- C语言中利用setjmp和longjmp做异常处理
- C语言利用setjmp和longjmp实现异常处理
- C异常处理机制:setjmp和longjmp
- C异常处理机制:setjmp和longjmp
- C异常处理机制:setjmp和longjmp
- C异常处理机制:setjmp和longjmp
- 计算素数的算法(一)
- 第一次实验作业(NPC问题----回溯算法,聚类分析)
- 怎么招聘程序员?
- 一些面试可能遇到的基础知识
- Android 批量设置监听器,监听器传递参数,重写监听器构造函数
- c语言 异常捕捉 setjmp & longjmp
- Hotelling transform,霍特林变换
- UDP校验和计算
- 数据库 行转列 列转行详解
- 孙鑫MFC消息映射机制的剖析
- 交叉工具链
- 开发 Servlet 三种方法
- 苹果新贵 Swift 之前世今生
- ThinkPHP中volist标签的使用