如何用C语言实现异常/状况处理机制

2025-05-08 16:05:03

1、GoTo语句,goto语句有非常多的用途或优点,例如,它特别适合于在编写系统程序中被使用,它能使编写出来的代码非常简练。另外,goto语句另外一个最重要的作用就是,它实际上是一种对异常处理编程,最初也最原始的支持手段或方法。它能把错误处理模块的代码有效与其它代码分离开来。如图,看goto语句的使用。

如何用C语言实现异常/状况处理机制

3、C语言更优雅更好用的异常处理机制:setjmp()函数与longjmp()函数

4、非局部跳转语句---setjmp和longjmp函数。非局部指的是,这不是由普通C语言goto,语句在一个函数内实施的跳转,而是在脯闾榆锇栈上跳过若干调用帧,返回到当前函数调用路径上的某一个函数中。#include <setjmp.h>Int setjmp(jmp_buf env); 返回值:若直接调用则返回0,若从longjmp调用返回则返回非0值Void longjmp(jmp_buf env,int val); 在希望返回到的位置调用setjmp,此位置在main函数中,因为直接调用该函数,所以其返回值为0.setjmp参数evn的类型是一个特殊的类型jmp_buf,这一数据类型是某种形式的数组,其中存放在调用longjmp时能用来恢复栈状态的所有信息。因为需要在另一个函数中引用env变量,所以规范的处理方式是将env变量定义为全局变量。 当检查到一个错误时,则以两个参数调用longjmp函数,第一个就是在调用setjmp时所用的env,第二个参数是具有非0值的val,它将成为从setjmp处返回的值。使用第二个参数的原因是对于一个setjmp可以有多个longjmp。

5、#include <stdio.h>#include <挢旗扦渌;stdlib.h>#include <setjmp.h>#include <string.h>void fun1(void);void fun2(void);jmp_buf jmpbuffer;void main(void){ int i = 0; int j = 0; i = setjmp(jmpbuffer); if(i==0) { printf("first run/n"); fun1(); fun2(); } else { switch(i) { case 1: printf("In fun1 /n"); break; case 2: printf("In fun2/n"); break; default: printf("unkown error/n"); break; } exit(0); } return 1;}void fun1(void){ char *s = "hello"; char *s1 = "Hello"; if(strcmp(s,s1)!=0) longjmp(jmpbuffer,1);}void fun2(void){ char *s = "world"; if(strcmp(s,"World")!=0) longjmp(jmpbuffer,2);}图中代码

如何用C语言实现异常/状况处理机制

6、这个函数最后的运行结果为图中所示。

如何用C语言实现异常/状况处理机制
声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢