[讨论]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
[解决办法]
[解决办法]
不知道楼主到底要干嘛。。。
实现这样的逻辑一定要用longjump吗??????????
[解决办法]
这种局部跳转用goto也可以呀
------解决方案--------------------
9楼的文章不错。
[解决办法]
不错啊!
[解决办法]
不错啊!
[解决办法]
过来看热闹,
[解决办法]
up
[解决办法]
来了。
[解决办法]
[解决办法]
见见
[解决办法]
see 了。。
[解决办法]
look look
[解决办法]
[解决办法]
[解决办法]
up
[解决办法]
受教了
[解决办法]
学习下
[解决办法]
mark
[解决办法]
这个 学习中
[解决办法]
没考虑过这个,学习了^_^
[解决办法]
学习了,多谢
[解决办法]
来学习
[解决办法]
见者。。。
[解决办法]
不太了解 setjump~ 学习了
[解决办法]
43 jf
[解决办法]
学习了
[解决办法]
学习
[解决办法]
学习!
[解决办法]
看看先...
[解决办法]
很少用这个........
[解决办法]
[解决办法]
如果longjmp传送的value参数值为0,那么实际上被setjmp返回的值是1
so
1.输入小于等于0的值
Input N:0
Error Test,ErrNum:1!
[解决办法]
C陷阱里有讲过,可以参考一下
------解决方案--------------------
[解决办法]
学习了
[解决办法]
错误控制转移