请教C语言怎么捕获任何异常,并且把异常信息

Python019

请教C语言怎么捕获任何异常,并且把异常信息,第1张

C语言没有异常这一说,请自行进行合法性的判断。1.使用标准C库提供了abort()和exit()两个函数,强行终止程序的运行,。2.使用assert(断言)宏调用,。3.使用errno全局变量,。4.使用goto跳转。5.使用setjmp,longjmp跳转。

这个用C实现的异常处理的关键函数是setjmp和longjmp,setjmp函数可以实现非局部标号,而longjmp实现程序内部的任意跳转(与之类似的我们经常使用的goto只能实现函数内部的跳转)。这两个函数的相互组合使用,百度百科给了如下总结:

1.setjmp(j)设置“jump”点,用正确的程序上下文填充jmp_buf对象j。这个上下文包括程序存放位置、栈和框架指针,其它重要的寄存器和内存数据。当初始化完jump的上下文,setjmp()返回0值。

2. 以后调用longjmp(j,r)的效果就是一个非局部的goto或“长跳转”到由j描述的上下文处(也就是到那原来设置j的setjmp()处)。当作为长跳转的目标而被调用时,setjmp()返回r或1(如果r设为0的话)。(记住,setjmp()不能在这种情况时返回0。)

通过有两类返回值,setjmp()让你知道它正在被怎么使用。当设置j时,setjmp()如你期望地执行;但当作为长跳转的目标时,setjmp()就从外面“唤醒”它的上下文。

我封装的异常处理库也是按照上面总结的方法使用的,理解了上面的总结再看代码就非常简单了。

在需要抛出异常的地方使用Throw宏抛出异常,它两个参数,一个是异常类型,一个是异常说明字符串。也可以使用ThrowAll来抛出一个任意类型的异常,但是此时只能使用Except才能捕获。

将可能出现异常的代码段使用Try包含起来。OnExcept用来捕获异常,它有一个参数,标记需要捕获什么类型的异常。如果此时有异常产生,异常类型与OnExcept要捕获的类型一致能会捕获到这个异常,否则抛弃。而如果使用Except宏则会捕获任意类型的异常。

最后需要调用Finally宏来进行清理,包括释放在Try宏内申请的内存空间。

一个简单的使用例子如下:

[cpp] view plaincopyprint?

#include <stdio.h>

#include <excp.h>

void fun(void* p){

if(p == NULL) Throw(1, "这个指针是空的呀!!!")

else printf("神马都是浮云!/n")

}

int main(){

void* p = NULL

Try{

fun(p)

}

OnException(1){

printf("%s/n", Message)

}

Finally{

printf("这个指针是空的我有啥用呀?/n")

}

return 0

}

[cpp] view plaincopyprint?

#include <stdio.h>

#include <excp.h>

void fun(void* p){

if(p == NULL) Throw(1, "这个指针是空的呀!!!")

else printf("神马都是浮云!/n")

}

int main(){

void* p = NULL

Try{

fun(p)

}

OnException(1){

printf("%s/n", Message)

}

Finally{

printf("这个指针是空的我有啥用呀?/n")

}

return 0

}

文章知识点与官方知识档案匹配

C技能树首页概览

108976 人正在系统学习中