C ++在另一个框架内没有任何参数的抛出会重新抛弃一个例外吗?

StackOverflow https://stackoverflow.com/questions/3561571

  •  01-10-2019
  •  | 
  •  

如果我有以下代码:

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。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top