由析构函数阻塞的C++异常处理

由析构函数阻塞的C++异常处理,c++,exception-handling,destructor,C++,Exception Handling,Destructor,我最近在使用两个第三方库时遇到了一个问题。我的代码称为库A,它称为库B。当库B遇到错误时,它会抛出异常;这是首选行为,因为它不知道应该如何处理错误。库A将使用其“虚拟析构函数”中的RAII清理其内部资源 由于这些资源是A中类的私有资源,因此我正在使用我无法提前清理这些资源 现在,在清理我在代码中使用的类的特定情况下,将调用a中的析构函数;然后依次调用B,B会抛出一个异常 我想在代码中捕捉这个异常,因为我不想更改第三方库的代码。不幸的是,我发现异常处理代码不会将异常传播回我的代码,而是会导致调用a

我最近在使用两个第三方库时遇到了一个问题。我的代码称为库A,它称为库B。当库B遇到错误时,它会抛出异常;这是首选行为,因为它不知道应该如何处理错误。库A将使用其“虚拟析构函数”中的RAII清理其内部资源

由于这些资源是A中类的私有资源,因此我正在使用我无法提前清理这些资源

现在,在清理我在代码中使用的类的特定情况下,将调用a中的析构函数;然后依次调用B,B会抛出一个异常

我想在代码中捕捉这个异常,因为我不想更改第三方库的代码。不幸的是,我发现异常处理代码不会将异常传播回我的代码,而是会导致调用abort方法

我最终改变了A的第三方代码,以捕获并忽略所有可能的异常


由于默认情况下gcc 4.8.1不会通过析构函数传播异常,哪些主要编译器及其版本会或不会通过析构函数传播异常

我确实相信标准中的某个地方定义了从析构函数抛出的异常可以导致调用std::terminate,至少在C++11中是这样。这是因为编译器将析构函数隐式标记为noexcept。

我很难理解您的解释。一个代码示例会有所帮助。不管怎么说,这是偶然发生的吗?15.2/1当控制从异常抛出到处理程序的点传递时,析构函数由本节中指定的称为堆栈展开的进程调用。如果堆栈展开直接调用的析构函数在异常情况下退出,则std::terminate被称为15.5.1。MyCode清理在a中定义的类。a调用B清理其内部成员。B抛出异常。M->A析构函数->B异常。这不是堆栈展开的一部分。B拥有的资源是一个套接字连接,并且已经处于不好的状态,这就是为什么我要清除对套接字的使用,以便可以重新创建套接字连接。这是一个更大的系统的一部分,我不想崩溃,尤其是当我试图在操作上解决问题时。有点像:,我喜欢这篇文章:。谢谢这段代码是跨平台的,并且运行在许多不同的机器上,具有同一编译器的多个不同版本,因此仍然是对编译器的一个改进,以及每个编译器中的行为何时发生更改都会很有帮助。