专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > C语言

[讨论]C中用setjmp和longjmp实现TRY.CATCH的不足与优越性,见者有分.该怎么解决

发布时间:2011-06-28 16:15:10 文章来源:www.iduyao.cn 采编人员:星星草
[讨论]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也可以呀
------解决方案--------------------
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: