读书人

[讨论]C中用setjmp和longjmp实现TRY.C

发布时间: 2012-03-09 16:54:57 作者: rapoo

[讨论]C中用setjmp和longjmp实现TRY...CATCH的不足与优越性,见者有分.
原创代码,不足之处请见凉

C/C++ code
/*error.h*/ #ifndef _ERROR_H #define _ERROR_H #include <setjmp.h> #include <string.h> #define TRY ErrNum = setjmp(Resume);if(0 == ErrNum)#define CATCH(n) else if((0 != ErrNum) && (((n) == ErrNum) || ((n) == ALL_ERROR)))#define THROW(n) longjmp((Resume),(n)) #define GET_ErrorString(n) errString[n]typedef enum {     ERROR_NONE,     ERROR_TEST,    MEMORY_OFFER,    DIVSION_BY_ZERO,    OUT_OF_RUN,/*     加入其它的错误号   */    ALL_ERROR,}ERROR_E; const char* errString[]= {     "",     "Error Test",    "Not enough memory",     "Divsion by zero",    "Out of run",/*     加入错误号所对应的错误信息 */ }; int     ErrNum = 0; jmp_buf Resume = {0}; #endif /*_ERROR_H*/ /*main.c*/ #include <stdio.h> #include <stdlib.h> #include "error.h" extern int     ErrNum;int main(void) {     int n = 0;    printf("Input N:");     scanf("%d",&n);     TRY     {        int j = 0;       if(0 >= n)        {           THROW(ERROR_TEST);        }       else if(n > 0 )       {            printf("N is:%d\n",n);        }       while (1)       {           j++;           if(j > 100000)              THROW(OUT_OF_RUN);       }    }     CATCH(ALL_ERROR)    {         printf("%s,ErrNum:%d!\n",GET_ErrorString(ErrNum),ErrNum);         exit(ErrNum);     } } 


1.输入小于等于0的值
Input N:0
Error Test,ErrNum:1!
2.输入大于0的值
Input N:1
N is:1
Out of run,ErrNum:4!


注意:上面的.h文件是C中TRY...CATCH的实现,main函数是TRY...CATCY的一个例子

[解决办法]
见者...
[解决办法]
.
探讨
见者...

[解决办法]
学习了。
[解决办法]
学习
[解决办法]
不错
[解决办法]
先见下
[解决办法]
探讨
见者...

[解决办法]
似乎还不支持嵌套啊...

这篇文章讲得相当详细~ http://blog.csdn.net/hbaizj/archive/2009/03/20/4008126.aspx
[解决办法]
这个我记得在C陷阱里有说吧,你可以参考一下里面的内容
[解决办法]
想法很新,感觉意思不大。
Exception Handle其实是很复杂的机制,很多问题都不好解决,
1. 存储空间的释放
2. 变量作用域的控制
3. Error Stack的管理

LZ这样写的TRY ... CATCH,感觉有很多使用约定在里面,如果应用在项目中,member使用不当
将会变成灾难。

不过作为研究讨论的话题,还是可以的。
[解决办法]
感觉setjump很遥远,linux/unix下用的比较多吧,windows下用seh
[解决办法]
探讨
感觉setjump很遥远,linux/unix下用的比较多吧,windows下用seh

[解决办法]
不知道楼主到底要干嘛。。。
实现这样的逻辑一定要用longjump吗??????????
[解决办法]
这种局部跳转用goto也可以呀
------解决方案--------------------


9楼的文章不错。
[解决办法]
不错啊!
[解决办法]
不错啊!
[解决办法]
过来看热闹,
[解决办法]
up
[解决办法]
来了。
[解决办法]

探讨
见者...

[解决办法]
见见
[解决办法]
see 了。。
[解决办法]
look look
[解决办法]
探讨
似乎还不支持嵌套啊...

这篇文章讲得相当详细~ http://blog.csdn.net/hbaizj/archive/2009/03/20/4008126.aspx

[解决办法]
探讨
似乎还不支持嵌套啊...

这篇文章讲得相当详细~ http://blog.csdn.net/hbaizj/archive/2009/03/20/4008126.aspx

[解决办法]
up
[解决办法]
受教了

[解决办法]
学习下
[解决办法]
mark
[解决办法]
这个 学习中
[解决办法]
没考虑过这个,学习了^_^
[解决办法]
学习了,多谢
[解决办法]
来学习
[解决办法]
见者。。。
[解决办法]
不太了解 setjump~ 学习了
[解决办法]
43 jf
[解决办法]
学习了
[解决办法]
学习
[解决办法]
学习!
[解决办法]
看看先...
[解决办法]
很少用这个........
[解决办法]
探讨
请大家不要,"见者,先见下,Up"之类的分字,这样没有多大的意义.
希望每个人能发表一下自己的意见,谢谢!

[解决办法]
如果longjmp传送的value参数值为0,那么实际上被setjmp返回的值是1
so
1.输入小于等于0的值
Input N:0
Error Test,ErrNum:1!

[解决办法]
C陷阱里有讲过,可以参考一下
------解决方案--------------------


探讨
见者...

[解决办法]
学习了
[解决办法]
错误控制转移

读书人网 >C语言

热点推荐