标签:
异常?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实现跳转会使得某些对象(大部分的局部对象)失去被析构的机会,即使是栈对象。)
标签:
原文地址:http://www.cnblogs.com/libig/p/4746693.html