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

异常?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实现跳转会使得某些对象(大部分的局部对象)失去被析构的机会,即使是栈对象。)

时间: 2024-08-08 17:51:51

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

删除C语言程序中所有的注释语句,代码实现

学习<C程序设计语言>到第1章最后,有一道题目: 编写一个删除C语言程序中所有的注释语句.要正确处理带引号的字符串与字符常量.在C语言中,注释不允许嵌套. Exercise 1-23. Write a program to remove all comments from a C program. Don't forget to handle quoted strings and character constants properly. C comments don't nest. 刚开始,

c语言程序中static作用

这里是static是静态局部变量,不会随着函数的结束而撤销,放在main函数里是没有实际意义的,下面一个是static的例子:void f(){static int x=0;int y=0;x++;y++;printf("%d %d\n", x, y);}void main(){f();f();f();} 这里运行了3次f(),但是static只会被定义一次,并不会随着f()函数的结束而消亡,但是y是局部变量,运行了3次它就被创建了3次消亡了3次,所以它的输出为:1 12 13 1

编写一个删除c语言程序文件中所有的注释语句

//删除c语言程序中所有的注释语句,要正确处理带引号的字符串与字符串常量 #include <stdio.h> using namespace std; #define MAXLINE 1000 void rcomment(int c); void in_comment(void); void deleteTail(void); FILE* fp; FILE* fp2; int main() { fp=fopen("C:\\Users\\Administrator\\Desktop\

C语言程序的内存布局

一:C语言程序的存储区域 C语言编写的程序经过编绎-链接后,将形成一个统一的文件,它由几个部分组成,在程序运行时又会产生几个其他部分,各个部分代表了不同的存储区域: 1.代码段(Code or Text): 代码段由程序中的机器码组成.在C语言中,程序语句进行编译后,形成机器代码.在执行程序的过程中,CPU的程序计数器指向代码段的每一条代码,并由处理器依次运行. 2.只读数据段(RO data): 只读数据段是程序使用的一些不会被更改的数据,使用这些数方式类似查表式的操作,由于这些变量不需要更改

C语言程序的三种基本结构

1.程序结构:在C语言程序中,一共有三种程序结构:顺序结构.选择结构(分支结构).循环结构: 顺序结构:从头到尾一句接着一句的执行下来,直到执行完最后一句: 选择结构:到某个节点后,会根据一次判断的结果来决定之后向哪一个分支方向执行: 循环结构:循环结构有一个循环体,循环体里是一段代码.对于循环结构来说,关键在于根据判断的结果,来决定循环体执行多少次: 注:在逻辑上有一种bool类型(也叫boolean类型,布尔类型),只有两个值,即真和假.C语言的判断表达式最终的值就是一个bool类型,这个判

C语言程序内存布局

C语言程序内存布局 如有转载,请注明出处:http://blog.csdn.net/embedded_sky/article/details/44457453 作者:[email protected] 一.几个概念 1.栈(Stack) C语言通过栈来维护函数调用上下文,也就是说C中的函数.函数参数列表.局部变量.函数返回值都保存在栈内存中,在完成函数调用之后栈帧随即销毁,至于具体的压栈顺序和上下文维护工作由谁来完成,则取决于函数的调用方式(cdecl/stdcall/fastcall/pasc

提升R语言程序性能

1.       性能测评 时间测定方法 R中提供的测量时间最简单的方法是system.time函数. system.time(expr, gcFirst=TRUE) 这个函数会在不降低程序运行性能的情况下,执行表达式expr,gcFrist则是指定程序运行前是否先执行垃圾回收. do.stuff <- function(){ a <- 1:100000 for(i in 1:100000){ a[i] <- a[i]^2 } a } system.time(do.stuff()) 监控

程序中内存从哪里来3

代码段.数据段.bss段1.(1)编译器在编译程序的时候,将程序中的所有元素分成了一些组成部分,各部分构成一个段,所以说 段是可执行程序的组成部分.(2)代码段:代码段就是程序中的可执行部分,直观理解代码段就是函数堆叠组成的.(3)数据段(也被称为数据区.静态数据区.静态区):数据段就是程序中的数据,直观理解就是C语言程序中的全局变量.(注意:全局变量才算是程序中的数据,局部变量不算程序的数据,只能算是函数的数据)(4)bss段(又叫ZI(zero initial)段):bss段的特点就是被初始

java程序中的经常出现的的异常处理课后总结

一.JDK中常见的异常情况 1.常见异常总结图 2.java中异常分类 Throwable类有两个直接子类: (1)Exception:出现的问题是可以被捕获的 (2)Error:系统错误,通常由JVM处理 3.被捕获的异常分类 (1)Check异常: 派生自Exception的异常类,必须被捕获或再次声明抛出 (2)Runtime异常:派生自RuntimeException的异常类.使用throw语句可以随时抛出这种异常对象 throw new ArithmeticException(…);