码迷,mamicode.com
首页 > 编程语言 > 详细

异常?C语言程序中我们如何管控(处理)运行期间的运行异常

时间:2015-08-21 07:05:23      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:

异常?C语言中我们如何管控(处理)运行期间的运行异常
方案1.通过返回值表达错误。程序中必须层层判断返回值,流程繁琐。
方案2.采用<setjmp.h>里面定义的setjmp/longjmp通过保存函数调用栈来实现远程跳转。这样就可以实现一步到位进入错误处理,流程简单。

 

 1 /*方案2应用举例:
 2  * Filename:jmperr.c
 3  * Discreption: 
 4  *    采用<setjmp.h>里面定义的setjmp/longjmp通过保存函数调用栈来实现远程跳转。这样就可以实现一步到位进入错误处理,流程简单。这是经典的C程序异常管控方案。
 5  *
 6  * */
 7 #include <stdio.h>
 8 #include <setjmp.h>
 9 
10 jmp_buf g_env;
11 
12 void func3 (void) {
13     FILE* fp = fopen ("none", "r");
14     if (! fp)
15        longjmp (g_env, -1);//进入该函数的执行后,会复原jmp_buf g_env里面保存的函数调用栈,并将-1放在返回值该放的位置
16                   //(p.s.调用从这里进入并没有从这里出来, 因为longtjmp函数复原了setjmp的调用栈)
17 
18     // ...
19     fclose (fp);
20 }
21 void func2 (void) {
22     func3 ();
23     // ...
24 }
25 void func1 (void) {
26     func2 ();
27     // ...
28 }
29 int main (void) {
30     if (setjmp (g_env) == -1) {//setjmp(g_env)可以将函数调用栈保存在jmp_buf g_env里面
31         printf("文件打开异常!\n");
32         return -1;
33     }
34     func1 ();
35     // ...
36     printf("执行成功!恭喜恭喜!\n"); 
37     return 0;
38 }

 

(post script: setjmp/longjmp是C程序员量身定制的经典异常处理方案。这种方案不能很好滴兼顾C++, 根本没有考虑到C++程序员定义的类类型,直接采用setjmp实现跳转会使得某些对象(大部分的局部对象)失去被析构的机会,即使是栈对象。)

异常?C语言程序中我们如何管控(处理)运行期间的运行异常

标签:

原文地址:http://www.cnblogs.com/libig/p/4746693.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!