什么时候可以从C ++中的析构函数中抛出异常?

时间:2008-12-24 14:54:16

标签: c++ exception

我知道规则是不要在析构函数中抛出一个,我理解为什么。我不敢这样做。但即使是C ++ Faq Lite也说99%的这个规则很好。他们未能深入研究的另外1%是什么?

Link to the C++ Faq Lite bullet point on throwing from ~():

7 个答案:

答案 0 :(得分:14)

就是不要这样做。 如果恒星和行星以你发现需要的方式对齐......

仍然不这样做。

答案 1 :(得分:12)

哇,我本来要投胡安,直到我看到关于从不使用例外的部分。

好的,首先,胡安说得对。如果出于某种原因,你最终会遇到两个异常追逐堆栈的情况,C ++会简单地抛出它的手和最后一餐然后异常终止。因此,从dtor抛出异常可以保证您有可能导致意外异常终止的代码路径,这通常是一件坏事。如果这就是你想要的,那就直截了当,打电话给中止或退出,然后把它搞定。

然而,关于通过不使用异常来避免它的部分是不好的建议。对于系统而言,异常实际上是C ++中必不可少的机制,这些系统将是健壮的并且可以运行很长时间。它们确实是唯一可以保证在不泄漏资源的情况下处理错误情况的方法。

碰巧我曾经为Marshall Cline工作,那个写了FAQ的人,从FAQ书中教过C ++;因此,我可以告诉你,你错误地解释了答案。他并没有说“哎呀,有一个案例可以说是好的,但我不会对你这么做,”他说“我敢肯定,如果我说绝对且毫无例外地说'总而言之,有人会提出一个有意义的离墙例子。但是我不知道一个并且不相信它。不要试着这个回家,并咨询律师,没有明示或暗示的保证。“

答案 2 :(得分:3)

如果一切都如此狡猾,你想让程序通过异常代码流终止。

答案 3 :(得分:3)

由于另一个例外,您必须保证不会调用析构函数。

话虽如此,我不使用例外。但是,如果我被迫使用它们来保住我的工作,我绝不会从析构函数中抛出异常。

答案 4 :(得分:2)

如果在堆栈展开期间未自动调用此析构函数,则可以从析构函数中抛出异常,或者抛出异常将导致调用terminate()。要确定从析构函数中抛出异常是否安全,请使用标准函数uncaught_exception();如果返回false,则抛出异常是安全的

答案 5 :(得分:2)

我想如果你能够可靠地检测到析构函数中的非常糟糕的情况,那么这个情况非常糟糕,没有好办法处理它,你必须确保进程停止 NOW 在其他事情发生之前......(想象一台计算机连接到枪或核导弹)但另外还有两个想法:

  1. 最好不要抛出异常,最好调用exit()或abort()或TerminateProcess()或明确停止事物的东西,而不是假设你知道编译器会把你的“扔掉”析构函数中的异常“在编译时进入。

  2. 这更像是一个人为的例子。极端安全检查应该在一个真实的功能中处理,该功能在明确定义的时间(或者更好,在硬件或冗余处理器中处理)有目的地执行,而不是在析构函数中作为事后的想法。

答案 6 :(得分:0)

如果破坏是受控过程的一部分,那么它是可以接受的,但是,你仍然需要尽可能地去掉剩余的引用,所以投掷可能不是很好。

破坏可能经常发生,因为抛出可能会破坏正常的代码逻辑。