您的位置:首页 > 编程语言 > C语言/C++

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

2015-08-21 03:18 232 查看
异常?C语言中我们如何管控(处理)运行期间的运行异常

方案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实现跳转会使得某些对象(大部分的局部对象)失去被析构的机会,即使是栈对象。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: