免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 我learnc
打印 上一主题 下一主题

[C++] 工作中你是否使用C++异常?  关闭 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-08-20 12:53 |只看该作者
异常处理跨平台能力好吗?
Windows平台使用Windows定义的异常,而不是native C++异常

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
12 [报告]
发表于 2009-08-20 13:07 |只看该作者

回复 #1 我learnc 的帖子

http://blog.csdn.net/pongba/archive/2007/10/08/1815742.aspx

可以参考一下, 里面提到了exception的各种优势。
但不是绝对的,也有其劣势。

论坛徽章:
0
13 [报告]
发表于 2009-08-20 13:29 |只看该作者
异常有好处也有问题。好处是它是比C的longjmp更稳键更灵活的长跳转,其实异常处理的含义是不要到处处理出错情况,把正常的逻辑和错误逻辑分离开以使它更清晰,但现实中许多人把它当成返回值使用了,如
int ret = func(...);
if (ret)
{
    ....;
}
改为
try
{
    func(...);
}
catch (...)
{
    ......;
}

这个其实没啥意义。

缺点是它的机制学通偏复杂了一些,而且最麻烦的是不同编译器实现不同、不同系统中不尽相同。异常处理是一个复杂的东西,系统到系统退栈、对象析构等,很难做的统一,如GCC 2.96 for PowerPC针对VxWorks的版本在异常处理中是调用了VxWorks的系统函数的,这样的话它带来的影响许多人很难看明白。
对于系统而言,有MMU的进程系统中,用try-catch (...)甚至可以抓到访问非法地址的异常,而在嵌入式系统中这种错误用C++是不可能抓到的。

异常还有一个问题是它会使软件变大,只要打开支持异常的开关,不使用任何try-catch就会这样。

C++的异常不是不可用,但一定要慎用,可以把这看成一个错误处理框架,要在设计程序结构时就去考虑它,而不是随手把返回值改为用异常。CppUnit中对于C++异常处理的使用感觉还不错,有兴趣的可以看一看。

论坛徽章:
0
14 [报告]
发表于 2009-08-20 14:55 |只看该作者
原帖由 Cyberman.Wu 于 2009-8-20 13:29 发表
异常有好处也有问题。好处是它是比C的longjmp更稳键更灵活的长跳转,其实异常处理的含义是不要到处处理出错情况,把正常的逻辑和错误逻辑分离开以使它更清晰,但现实中许多人把它当成返回值使用了,如
int ret ...

不太对头呀!
异常是你那个函数返回能表现的吗?呵呵。
要是能用函数返回值体现出来还叫异常吗?
那就变成你的逻辑上允许出现的错误了。你已经预见到了这个问题。那还叫异常啊!:wink:

论坛徽章:
0
15 [报告]
发表于 2009-08-20 14:58 |只看该作者
错误处理是很头疼的一块。

论坛徽章:
0
16 [报告]
发表于 2009-08-20 16:17 |只看该作者
原帖由 ddkkd 于 2009-8-20 14:55 发表

不太对头呀!
异常是你那个函数返回能表现的吗?呵呵。
要是能用函数返回值体现出来还叫异常吗?
那就变成你的逻辑上允许出现的错误了。你已经预见到了这个问题。那还叫异常啊!:wink:


不懂你所说的逻辑上允许出现的错误指什么,不管是C++还是Java,所谓的异常都可以通过返回值层层处理,不存在你说的没办法预见,无非是throw出现的,都是人做的,反抛出异常改为一个返回值不就没有所谓的“异常”了?这些编程语言的异常只是一种错误处理的机制,返回值错误一样有不可控性。

就算是CPU执行过程中的异常,也很难说叫逻辑上允许或不允许,如缺页异常。

论坛徽章:
0
17 [报告]
发表于 2009-08-20 16:19 |只看该作者
原帖由 prolj 于 2009-8-20 14:58 发表
错误处理是很头疼的一块。


这个的确是个问题,实际上错误处理要求一个整体性的设计,这方面都没见过几家公司做得比较好的。有时候看一个系统正常处理流程大家都会做,真正体现设计水平的反而体现在出问题的处理上。

论坛徽章:
0
18 [报告]
发表于 2009-08-20 16:25 |只看该作者

回复 #16 Cyberman.Wu 的帖子

我问你答吧。
你都知道哪儿出错了,还算异常吗?
出异常了,还会从这个返回值出来吗?
呵呵,其实我水平也一般哦。

论坛徽章:
0
19 [报告]
发表于 2009-08-20 16:36 |只看该作者

回复 #18 ddkkd 的帖子

那你认为异常是哪来的?还不是库或自己的代码中判断出现某种条件来个throw,这种东西难道真的不能用返回值替换吗?

用返回值处理最大的缺点是要层层处理,如A->B->C->D,而D中可以出错,那这种错误会沿着调用栈往上传,如果我们希望最终在A里处理,但B和C不得不判断这一情况并返回一个值加以区分;而用异常主要是它是一个完整的机制,使得我们设计B和C的时候不需要考虑这个错误情况就不对它进行任何设计,代码比较清晰,而真正出错了,则异常机制保证它析构B、C中相关的对象并把控制权返回到A继续处理。但实际上C++的异常各编译器差异较大,而且没有虚拟机的支撑容易出问题。

论坛徽章:
0
20 [报告]
发表于 2009-08-20 16:45 |只看该作者

回复 #19 Cyberman.Wu 的帖子

说的很清楚,不过像是再说java。
呵呵,简单具体点问吧,有一个函数,里面第三条语句会出现一个异常,你并不知道,函数会按你的返回值返回吗?
有没有可能直接异常退出?
还会把你要的东西传递出去吗?
不是说java哦:wink:

[ 本帖最后由 ddkkd 于 2009-8-20 16:50 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP