我希望我能更明确一些,但是在很多情况下,有几个例外正在运行中-都涉及析构函数,但仍然如此。
行为从C ++ 98到C ++ 17有何不同?
我敢说“在有几个例外情况发生时,没有办法抓住”。
答案 0 :(得分:4)
您可能会阅读throw的文档。
如果任何由堆栈展开机制直接调用的函数,在初始化异常对象之后且在异常处理程序启动之前,都将退出并退出异常,将调用
std::terminate
。这些函数包括具有自动存储期限的对象的析构函数,其作用域已退出,并且异常对象的副本构造函数被调用(如果不消除),以初始化按值捕获参数。
因此,调用std::terminate
而不是“正在运行多个异常” 。
只要它们不退出各自的功能,您可能仍然会有几个例外:
void foo()
{
struct S
{
~S()
{
try {
throw std::runtime_error("in S");
} catch (const std::exception& ex) {
std::err << ex.what(); // "in S"
}
}
} s;
throw std::runtime_error("In Foo");
}
答案 1 :(得分:0)
从来没有“正在运行的几个例外”。
如果在展开过程中引发异常,则程序将终止。
如果处理程序引发了异常,则该异常之前的异常将不再运行。