调用可以在C++中抛出异常的函数的析构函数

Gal*_*man 10 c++ destructor exception try-catch throw

我知道我不应该从析构函数中抛出异常.

如果我的析构函数调用一个可以抛出异常的函数,那么如果我在析构函数中捕获它并且不进一步抛出它是否可以?或者它是否会导致中止,我不应该从析构函数中调用这些函数?

jal*_*alf 19

是的,那是合法的.异常不能从析构函数中逃脱,但是在析构函数内部或它调用的函数中发生的任何事情都取决于您.

(从技术上讲,异常也可以从析构函数调用中逃脱.如果在堆栈展开期间发生这种情况,因为抛出了另一个异常,std::terminate则会调用.所以标准很好地定义了它,但这是一个非常糟糕的主意.)

  • 在正常情况下转义析构函数的异常绝对没有问题(未调用std :: terminate()).如果另一个异常已经传播(调用std :: terminate()),这只是一个问题,这是因为运行时无法处理同时传播的两个并行异常的概念(或者C++设计者无法想到逻辑方式)处理这种情况). (11认同)
  • 对不起挑剔,但我会使用"合法"以外的术语.在析构函数中抛出异常也是"合法的",即它将编译并运行.但这是一种不好的做法,会造成不愉快的影响. (2认同)