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

forwrj 2009-07-01 08:05:26
加精
原创代码,不足之处请见凉


/*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的一个例子
...全文
527 59 打赏 收藏 转发到动态 举报
写回复
用AI写文章
59 条回复
切换为时间正序
请发表友善的回复…
发表回复
redleaves 2010-03-11
  • 打赏
  • 举报
回复
这是C原生的异常机制,也是早期C++异常的基础...比如GCC现在还支持sjlj的C++异常机制.
楼主有点重复发明轮子的嫌疑了...呵呵
何牧晗 2009-10-23
  • 打赏
  • 举报
回复
见者...

forwrj 2009-07-06
  • 打赏
  • 举报
回复
[Quote=引用 51 楼 yashuwa0622 的回复:]
C陷阱里有讲过,可以参考一下
[/Quote]
不错的书,谢!
zzcmx2008 2009-07-05
  • 打赏
  • 举报
回复
错误控制转移
djog 2009-07-04
  • 打赏
  • 举报
回复
很少用这个........
yashuwa0622 2009-07-04
  • 打赏
  • 举报
回复
C陷阱里有讲过,可以参考一下
youzhe_ren 2009-07-04
  • 打赏
  • 举报
回复
如果longjmp传送的value参数值为0,那么实际上被setjmp返回的值是1
so
1.输入小于等于0的值
Input N:0
Error Test,ErrNum:1!
机智的呆呆 2009-07-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 forwrj 的回复:]
请大家不要,"见者,先见下,Up"之类的分字,这样没有多大的意义.
希望每个人能发表一下自己的意见,谢谢!
[/Quote]
见者,先见下,Up
brk1985 2009-07-04
  • 打赏
  • 举报
回复
学习了
jzd8000 2009-07-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 baihacker 的回复:]
见者...
[/Quote]
.....
sos2008 2009-07-03
  • 打赏
  • 举报
回复
学习下
s510601017 2009-07-03
  • 打赏
  • 举报
回复
受教了
fangxing0 2009-07-03
  • 打赏
  • 举报
回复
up
猞猁狲 2009-07-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ltc_mouse 的回复:]
似乎还不支持嵌套啊...

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

上面这个文章是转载的别贴出来了,少了一张很重要的图,看得我郁闷

下面这个是原版文章!要看看这个
http://blog.csdn.net/yujinqiong/archive/2009/05/09/4163997.aspx
Fleeboy 2009-07-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ltc_mouse 的回复:]
似乎还不支持嵌套啊...

这篇文章讲得相当详细~ http://blog.csdn.net/hbaizj/archive/2009/03/20/4008126.aspx
[/Quote]
  • 打赏
  • 举报
回复
看看先...
xiaoliang_c 2009-07-03
  • 打赏
  • 举报
回复
学习!
kronk 2009-07-03
  • 打赏
  • 举报
回复
学习
qiyexinglang 2009-07-03
  • 打赏
  • 举报
回复
学习了
zhangxfeng112 2009-07-03
  • 打赏
  • 举报
回复
43 jf
加载更多回复(34)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧