关于c里边的异常处理
在C语言里边你是如何进行异常处理.
我都是这样.
比如分配内存
char * p=new char[1000];
if(NULL==p)
{
//异常处理的代码.
}
这样写,写的的很麻烦.特别是需要判断的的东西比较多得时候.不知道各位高手们如何做的.
另外,对C++里边的异常处理我也老学不到家.各位兄弟姐妹教教我好吧.
问题点数:20、回复次数:13Top
1 楼megaboy(飞天御剑流之杀神一刀斩)回复于 2005-08-02 10:46:03 得分 5
C里面的异常处理可以通过setjmp和longjmp实现,例如:
jmp_buf jException;
if(setjmp(jException))
{
.............. //异常处理代码
}
............
char * p=new char[1000];
if(NULL==p)
{
longjmp(jException,1);
}
头文件:setjmp.h
jException结构变量存储了当前的过程活动记录,比如各个通用寄存器及段寄存器的值,当longjmp的时候,会恢复原来的环境。Top
2 楼ArcCreator(-=ROBOTECH=-)回复于 2005-08-02 10:56:20 得分 5
以前的一个项目,我们是这样做的.
设置一个错误构造体.如果出错了,将信息添到构造体中,然后调出错处理函数.程序终止.
Top
3 楼antijpn(antijpn)回复于 2005-08-02 11:26:59 得分 0
setjmp和longjmp用了以后后患无穷,这种做法不值得推荐Top
4 楼megaboy(飞天御剑流之杀神一刀斩)回复于 2005-08-02 11:36:59 得分 5
使用setjmp和longjmp处理异常是贝尔实验室的专家推荐的方法........Top
5 楼antijpn(antijpn)回复于 2005-08-02 12:00:21 得分 0
setjmp保存了你的寄存器和栈状态,除非你在每个函数的入口都设置一个setjmp,否则调用longjmp的时候setjmp点和longjmp点之间的各个函数调用的栈的消失Top
6 楼megaboy(飞天御剑流之杀神一刀斩)回复于 2005-08-02 12:33:23 得分 0
setjmp和longjmp本来就是设计成回复到原来的环境的,否则就不叫setjmp和longjmp了。Top
7 楼antijpn(antijpn)回复于 2005-08-02 13:37:12 得分 0
但是你要知道光依靠longjmp来进行非本地跳转的话,那么错误类型没办法保留,自然办法进行处理,而且这个只能捕捉到可以捕捉的异常,很多C++的异常机制可以捕捉的异常发生的时候你就已经失去控制权了,你还怎么自己调用longjmp?Top
8 楼WingForce(初六,履霜,坚冰至。)回复于 2005-08-02 14:19:36 得分 0
使用setjmp和longjmp处理异常是贝尔实验室的专家推荐的方法........
====================================
贝尔实验室的专家也不是神仙
说到底他们还是代码工人Top
9 楼megaboy(飞天御剑流之杀神一刀斩)回复于 2005-08-02 16:04:38 得分 0
别扯到c++上去,人家现在是在C这里问的问题,在C里面,只有用setjmp和longjmp来处理异常了。你看看人家是怎么问问题的???
在C语言里边你是如何进行异常处理.
......................Top
10 楼njchf()回复于 2005-08-02 22:57:32 得分 5
我觉得主要是考虑减少这些辅助代码,让程序看起来优雅一些
如果出错处理处理雷同的话可以使用带参宏来解决
例如
#define if_return(条件, 返回值, 错误信息) {if (条件) {错误日志; return 返回值;}}
c++里我也一般这样用,这是以前看linux下的一个驱动的代码学到的一招
对于异常也不好说怎么用,关键是不能乱用,要比较清晰的知道那个地方有可能出异常,只有这样你才能知道怎样进行异常处理,很多人乱用异常,但是没有进行恰当的异常处理,要么是掩盖了错误,要么就是弄得错误在哪发生的都查不出来,只能靠单步调试Top
11 楼antijpn(antijpn)回复于 2005-08-03 01:45:21 得分 0
既然你要断章取义,我也没办法,没什么可以说了Top
12 楼megaboy(飞天御剑流之杀神一刀斩)回复于 2005-08-03 07:47:31 得分 0
这怎么是断章取义呢,不要说人家在C论坛里面问的问题和开头那句问C如何处理异常的话,就算是最后那句话:
“另外,对C++里边的异常处理我也老学不到家.各位兄弟姐妹教教我好吧.”
人家还用了“另外”和“也”两个词,充分说明人家问的是C而不是C++的异常。
我现在发现你回答问题老是答非所问。
Top
13 楼bugebear3(bug)回复于 2005-08-23 14:59:30 得分 0
可否象中断处理程序一样,首先建立一个异常处理函数库,以函数指针的形式存储在一指针数组里;
触发异常时,再根据异常号进行调用,不过也比较复杂吧.Top




