我写了以下程序
#include <iostream> #include <stdexcept> class Myclass { public: ~Myclass() { //throw std::runtime_error("second (in destructor)"); throw 1; } }; void fun() { Myclass obj; } int main() { try { fun(); } catch (const std::exception& e) { std::cout << e.what(); } catch(...) { std::cout << " ... default Catch" << std::endl; } std::cout << "Normal" << std::endl; return 0; }
当我在C 98模式(cpp.sh)上运行程序时,它会打印出来
... default Catch Normal
当我使用C 14模式运行它时,它不会打印任何内容.为什么这种行为有变化?
我确实理解,每当发生任何异常并且任何析构函数(在堆栈展开过程中)抛出任何异常时,它都会终止应用程序.但是这里只有一次来自析构函数的try块抛出异常.
解决方法
从C 11开始,没有明确拼写异常规范的析构函数具有与默认生成的异常规范相同的异常规范.在您的情况下,默认生成的析构函数将是noexcept(大多数默认生成的析构函数都是),因此您的析构函数也被视为noexcept.从noexcept函数中抛出会自动调用std :: terminate.
如果您希望异常可以捕获,请将析构函数声明为throw:
~Myclass() noexcept(false) { //throw std::runtime_error("second (in destructor)"); throw 1; }
但在你这样做之前,重新考虑一下.这是一个bad idea to have throwing destructors.