欢迎来到天天文库
浏览记录
ID:48453827
大小:120.50 KB
页数:16页
时间:2020-01-31
《C异常处理实现(精).doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、.word可编辑.C异常处理实现:setjmp和longjmp此文为internet上选摘,过后我会用自己的理解补充此文。------------将对setjmp与longjmp的具体使用方法和适用的场合,进行一个非常全面的阐述。另外请特别注意,setjmp函数与longjmp函数总是组合起来使用,它们是紧密相关的一对操作,只有将它们结合起来使用,才能达到程序控制流有效转移的目的,才能按照程序员的预先设计的意图,去实现对程序中可能出现的异常进行集中处理。与goto语句的作用类似,它能实现本地的跳转这种情况容易理解,不过还是列举出
2、一个示例程序吧!如下:voidmain(void){intjmpret;jmpret=setjmp(mark);if(jmpret==0).专业.专注..word可编辑.{//其它代码的执行//判断程序远行中,是否出现错误,如果有错误,则跳转!if(1)longjmp(mark,1);//其它代码的执行//判断程序远行中,是否出现错误,如果有错误,则跳转!if(2)longjmp(mark,2);//其它代码的执行//判断程序远行中,是否出现错误,如果有错误,则跳转!if(-1)longjmp(mark,-1);//其它代码的执
3、行}else{//错误处理模块switch(jmpret){case1:printf("Error1"n");.专业.专注..word可编辑.break;case2:printf("Error2"n");break;case3:printf("Error3"n");break;default:printf("UnknownError");break;}exit(0);}return;} 上面的例程非常地简单,其中程序中使用到了异常处理的机制,这使得程序的代码非常紧凑、清晰,易于理解。在程序运行过程中,当异常情况出现后,控制流是
4、进行了一个本地跳转(进入到异常处理的代码模块,是在同一个函数的内部),这种情况其实也可以用goto语句来予以很好的实现,但是,显然setjmp与longjmp的方式,更为严谨一些,也更为友善。程序的执行流如图17-1所示。.专业.专注..word可编辑.setjmp与longjmp相结合,实现程序的非本地的跳转呵呵!这就是goto语句所不能实现的。也正因为如此,所以才说在C语言中,setjmp与longjmp相结合的方式,它提供了真正意义上的异常处理机制。其实上一篇文章中的那个例程,已经演示了longjmp函数的非本地跳转的场景
5、。这里为了更清晰演示本地跳转与非本地跳转,这两者之间的区别,我们在上面刚才的那个例程基础上,进行很小的一点改动,代码如下:.专业.专注..word可编辑.voidFunc1(){//其它代码的执行//判断程序远行中,是否出现错误,如果有错误,则跳转!if(1)longjmp(mark,1);}voidFunc2(){//其它代码的执行//判断程序远行中,是否出现错误,如果有错误,则跳转!if(2)longjmp(mark,2);}voidFunc3(){//其它代码的执行//判断程序远行中,是否出现错误,如果有错误,则跳转!if
6、(-1)longjmp(mark,-1);}.专业.专注..word可编辑.voidmain(void){intjmpret;jmpret=setjmp(mark);if(jmpret==0){//其它代码的执行//下面的这些函数执行过程中,有可能出现异常Func1();Func2();Func3();//其它代码的执行}else{//错误处理模块switch(jmpret).专业.专注..word可编辑.{case1:printf("Error1"n");break;case2:printf("Error2"n");break
7、;case3:printf("Error3"n");break;default:printf("UnknownError");break;}exit(0);}return;}回顾一下,这与C++中提供的异常处理模型是不是很相近。异常的传递是可以跨越一个或多个函数。这的确为C程序员提供了一种较完善的异常处理编程的机制或手段。.专业.专注..word可编辑.setjmp和longjmp使用时,需要特别注意的事情1、setjmp与longjmp结合使用时,它们必须有严格的先后执行顺序,也即先调用setjmp函数,之后再调用longjm
8、p函数,以恢复到先前被保存的“程序执行点”。否则,如果在setjmp调用之前,执行longjmp函数,将导致程序的执行流变的不可预测,很容易导致程序崩溃而退出。请看示例程序,代码如下:classTest{public:Test()~Test()}obj;//注意
此文档下载收益归作者所有