【发布时间】:2017-04-18 12:53:17
【问题描述】:
我写了以下程序
#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 模式运行它时,它不会打印任何内容。 为什么这种行为会发生变化?
我明白,每当发生任何异常并且任何destructor(在堆栈展开过程中)抛出任何异常时,它都会终止应用程序。但是这里只有一次从try 块中抛出异常,即来自destructor。
【问题讨论】:
-
g++ 说:“main.cpp:12:15:警告:throw 将始终调用 terminate() [-Wterminate]”“main.cpp:12:15:注意:在 C++11 中析构函数默认为 noexcept"
-
上一个更相关的问题在这里:stackoverflow.com/a/16540757/1858225