C++ 将C++;在没有参数的情况下抛出在另一个框架内工作以重新抛出异常?

C++ 将C++;在没有参数的情况下抛出在另一个框架内工作以重新抛出异常?,c++,exception,rethrow,C++,Exception,Rethrow,如果我有如下代码: try { doSomething(); } catch (...) { noteError(); } void noteError() { try { throw; } catch (std::exception &err) { std::cerr << "Note known error here: " << err.what(); } catch (...) { std::cerr <&

如果我有如下代码:

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;
}
试试看{
doSomething();
}捕获(…){
noteError();
}
void notererror(){
试一试{
投掷;
}捕获(标准::异常和错误){

std::cerr您的原始代码很好。您捕获了不同的异常类型,并调用了一个函数,该函数将记录消息并重试。不需要将
throw
语句直接显示在相应的
catch
块中。如果调用其中一个“note”函数,而您当前没有处理异常,那么您的程序将调用
terminate()


您的新代码也很好。可以捕获所有内容,然后调用另一个函数,该函数将重定向到更具体的处理程序。也就是说,在分派块完成后重定向异常看起来有点奇怪,但是如果在返回
noteError
后发生了相同的
throw
语句(在原来的
catch
块中)而不是现在的位置,那么它将是非常普通的;标准§15.1/6中演示了这一点。

标准(§15.1/2)中的措辞是(强调我的):

当抛出异常时,控件将被转移到具有匹配类型(15.3)的最近的处理程序;“最近的”表示控件线程最近为其输入了try关键字后的复合语句、ctor初始值设定项或函数体,但尚未退出的处理程序

当一个try块“退出”时?根据语法(§15/1),try块以一系列处理程序结束,因此当最后一个处理程序结束时,该块结束。换句话说:

try // <- start of try block
{
}
catch (whatever) // <- first handler
{
}
// ... more handlers
catch (whatever_again) // <- last handler
{
} // <- end of try block

try//try it and see?我怀疑它甚至不会编译,但我讨厌异常,所以实际上不知道。@Dash,“try it and see”并不总是给出一个有效且自信的答案。可能是未定义的行为,尝试它只会证明它在您的机器上工作,而不是在其他任何地方。或者,如果失败,可能是由于编译器错误未能实现标准的特定方面。@Rob很好,谢谢。“在您能找到的每个编译器上试用并查看,然后将Comeau联机编译器添加到该列表的前面”?:)@达什:不,回答这个问题的唯一方法是引用权威来源,如《标准》。很难证明没有数据损坏是由特定的不当行为造成的。我以一种我仍然认为有效的方式扩展了这个问题,但请你确认第二次抛出也会有效。@William:尽快当您在
throw
之后加上分号时,您可能会感兴趣。