回复:[M] Prelude to K.O. (4.5) + 12楼(4.75)
C++是非常灵活的语言,适当利用智能指针可保证内存自动回收,这样就不用层层嵌套try...catch了. |
据我有限的理解,所谓的智能指针仅仅是保证在对象不再被引用的时候自动“析构”而已,和异常处理风马牛不相及,不用try...catch一样会挂。
如有错误,请纠正。
话说回来,delphi不也会面临层层套用try...catch的问题吗? |
估计你还是对Delphi的异常处理的能力没有概念,不过可以理解,就算一般的初等Delphi玩家也会有相同的错误概念。
不过看在您也算C++的经验玩家的份上,我就不点得太明白了:
*在双重throw的时候不会挂掉,就算不catch;任何使时候throw出去的exception都可以被接管,就算不catch* <--- 从这点开始发散您的思维,想象一下能够实现什么吧。
不过构造异常类对象也有可以抛出异常,这样上层得到的异常对象要么不存在,要么描述异常的信息不完整,delphi也应该会遇到这种问题 |
好像您有点晕了...
异常处理不是从构造异常对象时开始的,而是从抛出那一刻开始的。构造一个异常的时候,这个异常并没有抛出,对于机器而言,这个构造完全可能是正常的程序过程。这个时候如果发生异常,抛出的当然将是另一个的异常。
而且Delphi中永远不会出现构造不完整的对象 (解释就在您前面引用给我看得文章中),因此这种情况也不会出现C++中可能出现的内存漏洞问题。
异常主要不是用来调试的,调试不能因异常而停止后面代码的测试. ...异常是一种更方便快捷地处理无法继续运行的问题的机制. |
这两句话明显自相矛盾:
如果程序遇到异常而可以不停止调试,那就证明程序可以继续运行下去,那么也就没有必要使用异常
(反映到实际使用中,比如分配、调用资源的失败,都可以用返回值,没有必要使用异常);
如果程序真的无法继续下去,那么抛出异常将是唯一的解决办法,而且是最好的调试方法,因为无法通过返回值处理
(反映到实际使用中,比如引用失效的指针、内存位置,没有有意义的返回值,有必要使用异常)。
我同意的说法是:
异常不是只能用来调试的,调试可以不因异常而停止后面代码的测试. ...异常是处理无法继续运行的问题的不可替代的机制. |
析构确实没什么理由需要抛出异常,所有释放资源的函数都不需要抛出异常. 除了资源回收,析构还需要做什么呢? 我的原则是构造和析构都仅仅对成员变量做最基本的初始化和释放,不把复杂的工作放到构造和析构中. 如果真对析构中调用的函数不放心,就用cache(...)忽略掉或做个log好了.如果资源释放都不能如愿,对象析构也就没什么意义了. |
您因为自己的习惯而引发的概论只能证明您的群体合作经验比较少。
我相信您的描述可以自圆其说,但是,你不能将自己的意愿强迫到别人的头上。别人怎么提供别人的实现,这是与您怎么实现您的对象是非常不同的事情。
Delphi和C++异常处理对于一个人的几万行程序来说,基本没有区别。但是对于多人,特别是以松散方式合作的组来说,C++异常的scalability要差得多(这里的意思是,随着规模的扩大而导致可用性的快速降低),这个是不争的事实。
当然如果你能强制别人按照你的思路来办事情,这样会好得多;
其实,如果强制所有人按一个人的思路来做事,世界上很多问题也都可以很好的解决。
但是问题是,无数的历史事实证明,独裁的结果肯定是快速灭亡,因此不是一个解决问题的办法。
Prz 最后编辑于 2007-06-12 00:51:08