CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

关于c里边的异常处理

楼主xwjbs(xwjbs)2005-08-02 10:36:10 在 C/C++ / 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

相关问题

  • c++异常处理问题
  • c/s连接异常处理
  • 求 c 语言中的异常处理
  • 高手谈C#异常处理!
  • 高分求助,C#调用C++得异常处理,在线等
  • **C++ Primer讨论题系列[20]:关于C++的异常处理机制**
  • 关于数据库异常后的处理(C++Builder50)
  • c++builder异常处理的问题,千万要回答!!!
  • c++异常处理机制有何优点!
  • C++的异常处理与Java的不同和变通

关键词

  • c++
  • 函数
  • 代码
  • 专家
  • longjmp
  • setjmp
  • 处理
  • 异常
  • jexception
  • 错误

得分解答快速导航

  • 帖主:xwjbs
  • megaboy
  • ArcCreator
  • megaboy
  • njchf

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo