C语言异常处理和exit()怎样使用?

C语言异常处理和exit()怎样使用?,第1张

c语言中exit()函数的用法:

用exit()函数可以退出程序并将控制权返回给 *** 作系统,而用return语句可以从一个函数中返回并将控制权返回给调用该函数的函数。如果在main()函数中加入return语句,那么在执行这条语句后将退出main()函数并将控制权返回给 *** 作系统,这样的一条return语句和exit()函数的作用是相同的。下例是一个使用了exit()函数和return语句的程序:

#include <stdio.h>

#include <stdlib.h>

int main (int, char** )

int do_processing (void)

int do_something_daring()

int main (int argc, char** argv)

{

int ret_code

if (argc <3)

{

printf ("Wrong number of arguments used ! \n")

/* return 1 to the operating system * /

exit(1)

}

ret_code = do_processing ()

......

/* return 0 to the operating system * /

exit(0)

}

int do_processing(void)

{

int rc

rc = do_aomcthing_daring()

if (rc == ERROR)

{

printf ("Something fiahy ia going on around here... *\n)

/* return rc to the operating syatem * /

exit (re)

}

/* return 0 to the calling function * /

return 0

}

在上例的main()函数中,如果argc小于3,程序就会退出。语句“exit(1)”指示程序在退出时将数字1返回给 *** 作系统。 *** 作系统有时会根据程序的返回值进行一些相关的 *** 作,例如许多DOS批处理文件会通过一个名为ERRORLEVEL的全局变量来检查可执行程序的返回值。

这个用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 人正在系统学习中


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11520077.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存