异常?C语言程序中我们如何管控(处理)运行期间的运行异常
2015-08-21 03:18
232 查看
异常?C语言中我们如何管控(处理)运行期间的运行异常
方案1.通过返回值表达错误。程序中必须层层判断返回值,流程繁琐。
方案2.采用<setjmp.h>里面定义的setjmp/longjmp通过保存函数调用栈来实现远程跳转。这样就可以实现一步到位进入错误处理,流程简单。
(post script: setjmp/longjmp是C程序员量身定制的经典异常处理方案。这种方案不能很好滴兼顾C++, 根本没有考虑到C++程序员定义的类类型,直接采用setjmp实现跳转会使得某些对象(大部分的局部对象)失去被析构的机会,即使是栈对象。)
方案1.通过返回值表达错误。程序中必须层层判断返回值,流程繁琐。
方案2.采用<setjmp.h>里面定义的setjmp/longjmp通过保存函数调用栈来实现远程跳转。这样就可以实现一步到位进入错误处理,流程简单。
/*方案2应用举例: * Filename:jmperr.c * Discreption: * 采用<setjmp.h>里面定义的setjmp/longjmp通过保存函数调用栈来实现远程跳转。这样就可以实现一步到位进入错误处理,流程简单。这是经典的C程序异常管控方案。 * * */ #include <stdio.h> #include <setjmp.h> jmp_buf g_env; void func3 (void) { FILE* fp = fopen ("none", "r"); if (! fp) longjmp (g_env, -1);//进入该函数的执行后,会复原jmp_buf g_env里面保存的函数调用栈,并将-1放在返回值该放的位置 //(p.s.调用从这里进入并没有从这里出来, 因为longtjmp函数复原了setjmp的调用栈) // ... fclose (fp); } void func2 (void) { func3 (); // ... } void func1 (void) { func2 (); // ... } int main (void) { if (setjmp (g_env) == -1) {//setjmp(g_env)可以将函数调用栈保存在jmp_buf g_env里面 printf("文件打开异常!\n"); return -1; } func1 (); // ... printf("执行成功!恭喜恭喜!\n"); return 0; }
(post script: setjmp/longjmp是C程序员量身定制的经典异常处理方案。这种方案不能很好滴兼顾C++, 根本没有考虑到C++程序员定义的类类型,直接采用setjmp实现跳转会使得某些对象(大部分的局部对象)失去被析构的机会,即使是栈对象。)
相关文章推荐
- Standard C++ Episode 4
- 使用 cscope浏览 C++文件
- ZOJ 3674 Search in the Wiki 【C++STL大法尽情地模拟】
- C语言内存分配
- C++实现KMP模式匹配算法
- C++ 小技巧之一条语句多行书写
- Codeforces Round #285(Div.2) A,B,C 解题报告
- C++ 的忠告
- 04==C语言(分支结构)
- C++ 小技巧之 字符串字面值拼接
- C++嵌入Python程序(二):参数传入及返回
- C++对象模型——异常处理 (Exception Handling)(第七章)
- 传送门2号 - 算法 x C++
- 警惕C++隐式转换(More Effectiv C++_5(运算符))
- 迷宫游戏C语言实现
- C++中引用(&)的用法和应用实例(转)
- C/C++笔试面试系列之一
- C#与C++的命名空间
- 零基础学C语言 笔记一 变量 printf
- 从背后知道C语言程序是怎么运行的