本周GC07:关于异常

原本有两套底层库,NF3D和GC,各有千秋,07年正在按照他们,做一个统一的底层库GC07,主要是方便自己的实践,同时不要太依赖于DX的框架集。由于看OGRE的代码中遍地异常,所以一直被它牵引着,希望也来实现一套异常。经过这两天的查找和讨论,最终决定放弃这个想法了。

诚然,异常有很多好处,但是,在工程中,异常也有很多难以克服的硬伤。

第一,如果用异常的方式来控制错误,对库的使用者提出了较高要求。库的使用者必须考虑到很多问题,否则就只能使用库自带的异常处理(如果有的话)。而且,异常本身还有诸多限制,例如:不能在析沟函数中跑出异常等等。

第二,异常并不会使程序更安全,它只不过是提醒的一种手段和一种特殊的格式。switch case容易忘掉某些错误(比如新加了几个错误代码,原有调用这个函数的地方都必须记得去改,如果不改,可能一开始没有什么错误,但是一出错就会很严重),而异常打死都忘不了(马上就是个弹出框,除非瞎子,否则死都忘不掉)。这是异常的一个优点,但是,无论异常还是SC,都不会让程序更安全,该挂还是挂。把心态放到这个上面,不如去想如何写这样的代码:即便发生了错误,但一切都还正常,只是逻辑不对而已。而要完成这个工作,主要靠的是垃圾回收和Count Ptr,无论异常还是返回值都得靠边站。

第三,异常可以让程序代码和错误处理代码完全分开,但这个,对于一个使用异常的高手而言是一个好处,对一个不那么高的来说,则可能是个噩梦。在一个底层库抛出的异常,经由一个没有Catch的中间层,传递到用户手里,有时候,用户希望函数虽然错误,但是仍能完成一些功能,但现在,一切都将从Catch后开始,中间跳过了哪些逻辑?这个是很难管理的。特别是当代码越来越紊乱的时候,即便一位高手能保证底层库的安全,但是,能保证中间层的提供者也是一样的高手吗?

第四,异常不可以跨越语言,当然,SEH可以,但SEH不跨平台。在VC下抛出的异常,在BCB下完全无法Catch,更不要提什么C#了。这样,当你做库的Wrapper的时候,不得不catch所有的异常并将它们转化成返回值……除非能保证两个人使用同样的C编译器,否则,VC下面编译的底层库将无法由其他C++编译器提供中间层插件和工具。甚至VC7和VC6都不能在一起工作,这对于一个设计为类COM结构的库不啻为一个重大打击。

GC07准备沿用返回值的做法,同时对主要指针实行Count Ptr管理,并对Memory提供基本的监控手段。异常相关的方面,仅是在少数不得不抛的地方(致命错误)抛出少量互不相干的异常。另外就是在不影响效率的前提下,对SEH和C++异常进行Catch和“无公害化”处理。对于极少数致命错误,则通过记录程序栈的方式,给出尽可能多的信息以供快速定位。

有错误和不足的地方,希望大家帮忙,谢谢大家 ^_^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值