如果我有多个catch块,在程序执行期间,首先抛出一个异常,在堆栈展开期间抛出第二个异常,catch块只捕获最外层异常或捕获签名匹配的所有异常。抓住了?
答案 0 :(得分:7)
如果“在堆栈展开期间,抛出第二个异常”,并且第二个异常经历了第一个异常展开的相同函数堆栈帧(也就是说,第二个异常会使对象的析构函数被解除第一个例外),std::terminate
将被调用。因此,每个特定try
块都只有一个例外。
这是C ++ 11将所有析构函数默认为noexcept
的部分原因。
关于标题中的问题,是的,catch
块是独占的;将执行第一个匹配的catch
块,跳过其他块。