escape
驱动老牛
驱动老牛
  • 注册日期2002-02-01
  • 最后登录2004-08-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1688回复:13

C++的xyz老手问个abc的问题?

楼主#
更多 发布于:2004-06-26 09:03

曾听大牛说过,C++中出错处理时,使用goto语句是一种可以
接受的编程风格。比如一个函数,有很多种出错情况。但是他们的
出错处理却大同小异。这时候使用goto语句就会很方便。

问题是有没有更好的方法?
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-06-26 09:07
使用异常更好些一吧
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
escape
驱动老牛
驱动老牛
  • 注册日期2002-02-01
  • 最后登录2004-08-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-06-26 09:25
异常开销可能比较大。
如果出错处理部分基本相同,却又有一些小的差别,怎么办?
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2004-06-26 09:59
像这样呢?:D

void p = NULL;
bool bOK = false;
do
{
   // do something
   p = new int;
   if(!p)
   break;
   //...
   // break;
   //...
   bOK = true;
}
while(0)

//处理
if(p)
delete p;

if(!bOK)
{
//...
}
escape
驱动老牛
驱动老牛
  • 注册日期2002-02-01
  • 最后登录2004-08-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-06-26 10:09
感觉是后现代的风格!
果然是高手!服了!

escape
驱动老牛
驱动老牛
  • 注册日期2002-02-01
  • 最后登录2004-08-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-06-26 11:51
感觉还是用goto比较习惯。用了这么多年了。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2004-06-26 15:04
break能确定方向(一定是往下去了),谁知道你的goto是到哪呀? :D
其实还是异常比较好些吧
escape
驱动老牛
驱动老牛
  • 注册日期2002-02-01
  • 最后登录2004-08-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-06-26 18:33
有道理。
histimes
驱动牛犊
驱动牛犊
  • 注册日期2004-06-25
  • 最后登录2004-07-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-06-29 10:25
用try catch
try
{
   if ( i== 0)
     throw(1)

}
catch(...)
{
  Foo
}
即使从try块内调用的函数中throw,catch也会接受到。
caval2000
驱动牛犊
驱动牛犊
  • 注册日期2004-07-14
  • 最后登录2005-05-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-07-22 15:32
 
如果出错处理部分基本相同,却又有一些小的差别,怎么办?

设个flag部就好了阿?
{
void* p1 = NULL;
void* p2 = NULL;
int error = 0;
...// allocate p1
if(p1 != NULL){
  error = 1;
  goto FAILED;
}
...// allocate p2
if(p2 != NULL){
  error = 2;
  goto FAILED;
}
  ...
  
FAILED:
  if(error == 1){
    ...}
  else if(error == 1){
    ...}
  else ...    
        
  // common error process
  ...

}

error 的种类可以学ms 用宏定义先,搞的很标准的样子
还可以直观的了解是什么错误。
如果error种类多的话可以改if else为结构
typedef struct error_process{
int error_code;
void (*process_func)();
}_error_process;
然后初始化一下,没对应处理的就设process_func=NULL,
调用一下
for(int i=1;i<num_of_error_type;i++)
{
  *.process_func();
}

胡说了一通

[编辑 -  7/22/04 by  caval2000]
:)
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
10楼#
发布于:2004-07-23 10:05
GOTO没什么不好,别拉不出屎,怪马捅不好,嘿嘿......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
Leopard
驱动老牛
驱动老牛
  • 注册日期2001-07-13
  • 最后登录2021-12-15
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望53点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
  • 社区居民
  • 忠实会员
11楼#
发布于:2004-07-23 17:05
用多了会昏的!
Coren
驱动牛犊
驱动牛犊
  • 注册日期2004-07-24
  • 最后登录2005-02-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-07-25 15:37
果然好方法。。。
Coren
驱动牛犊
驱动牛犊
  • 注册日期2004-07-24
  • 最后登录2005-02-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-07-25 15:54
呵呵 为什么不把两种方法结合起来?
设个flag
{
void* p1 = NULL;
void* p2 = NULL;
int error = 0;
...// allocate p1
try
{
if(p1 != NULL){
error = 1;
}
...// allocate p2
if(p2 != NULL){
error = 2;
}
}catch(...)
{
handle_fun(yourhandle_fun,error)
}
....//continue;

//出错处理函数
typedef (*error_handle)(int)
{
//handle error
}
error_handle phandle;
//标准出错处理函数:
handle_fun(void phandle(int) ,int error)
{
phandle(error);
}
游客

返回顶部