C ++在另一个框架内没有任何参数的抛出会重新抛弃一个例外吗?
题
如果我有以下代码:
try {
doSomething();
} catch (...) {
noteError();
}
void noteError() {
try {
throw;
} catch (std::exception &err) {
std::cerr << "Note known error here: " << err.what();
} catch (...) {
std::cerr << "Note unknown error here.";
}
throw;
}
原始异常会从NoteError()下部框架内的两个位置抛弃吗?
解决方案
标准中的措辞(第15.1/2节)是(强调我的):
当抛出异常时,将控制转移到 与匹配类型的最近处理程序 (15.3); “最近”是指化合物,CTOR-Initializer或功能体的处理程序 遵循Try关键字,最近由控制线来输入,但尚未退出。
何时“退出”试验块?根据语法(§15/1),尝试块以a结尾 顺序 处理程序,因此当最后一个处理程序结束时,块结束了。换句话说:
try // <- start of try block
{
}
catch (whatever) // <- first handler
{
}
// ... more handlers
catch (whatever_again) // <- last handler
{
} // <- end of try block
是的,您的代码很好。重新投入时,最近的尝试块具有匹配的处理程序(即 catch (...)
),以便输入该处理程序。
其他提示
您的原始代码很好。您捕获了不同的异常类型,并调用一个可以记录消息并重新恢复的函数。这 throw
语句不需要直接出现在相应的 catch
堵塞。如果您称之为“注释”功能之一,那么您就是 不是 但是,目前正在处理一个例外,然后您的程序会致电 terminate()
.
您的新代码也可以。可以捕获所有内容,然后调用另一个函数,将其重新转换为更具体的处理程序。那是 这 异常调度员 C ++常见问题中描述的成语. 。看起来有点奇特 后 调度块已经完成,但是如果相同 throw
发生了声明 noteError
返回(在原始 catch
块)而不是现在的位置,而是完全普通的;它在标准中证明了§15.1/6。
不隶属于 StackOverflow