我自己也经历过同样的困境。
基本上我得出的结论是,接受那些析构函数正在投掷的事实并忍受其后果通常比让他们不投掷的痛苦要糟糕得多。
原因是当你抛出析构函数时,你会冒更多的不稳定和不可预测的状态。
举个例子,我曾经参与过一个项目,由于各种原因,一些开发人员在项目的某些部分使用异常来进行流控制,并且多年来一直运行良好。后来,有人注意到在项目的不同部分,有时客户端未能发送它应该发送的一些网络消息,因此他们创建了一个 RAII 对象,该对象将在其析构函数中发送消息。有时网络会抛出异常,所以这个 RAII 析构函数会抛出,但谁在乎呢?它没有要清理的内存,因此它不是泄漏。
这在 99% 的情况下都可以正常工作,除非异常流控制路径碰巧穿过网络,然后也会引发异常。然后,你有两个实时异常同时被解除,所以“砰你死了”,用 C++ FAQ 的不朽话语来说。
老实说,我宁愿让程序在析构函数抛出时立即终止,这样我们就可以与编写抛出析构函数的人交谈,而不是尝试使用故意抛出析构函数来维护程序,这似乎是委员会/社区的共识. 所以他们做了这个突破性的改变来帮助你断言你的析构函数是好的而不是抛出。如果您的遗留代码库中有很多 hack,可能需要做很多工作,但是如果您想继续开发和维护它,至少在 C++11 标准上,您最好进行清理工作了析构函数。
底线:
你是对的,你不能真的希望保证你找到所有可能的抛出析构函数的实例。因此,在某些情况下,当您的代码在 C++11 编译时,可能会在不符合 C++98 标准的情况下崩溃。但总的来说,清理析构函数并以 C++11 运行可能会比仅使用旧标准的抛出析构函数稳定得多。