代码之家  ›  专栏  ›  技术社区  ›  WilliamKF

C++中没有参数的抛出会在另一帧内工作,以重新抛出异常吗?

  •  5
  • WilliamKF  · 技术社区  · 14 年前

    如果我有如下代码:

    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()的下框中的两个位置抛出?

    2 回复  |  直到 14 年前
        1
  •  4
  •   GManNickG    14 年前

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

    当引发异常时,控件将传输到 具有匹配类型的最近处理程序 (15.3);_156; nearest_157;表示复合语句、ctor初始值设定项或函数体的处理程序 跟踪try关键字的是控件线程最近输入的,但尚未退出。

    何时“退出”了Try块?根据语法(_§15/1),试块以 序列 处理程序,因此块在最后一个处理程序结束时结束。换言之:

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

    是的,你的代码很好。当重新抛出时,最近的try块有一个匹配的处理程序(即 catch (...) ,以便输入处理程序。

        2
  •  6
  •   Rob Kennedy    14 年前

    你的原始代码没问题。捕获了不同的异常类型,并调用了一个函数,该函数将记录一条消息并重新执行。这个 throw 语句不需要直接出现在相应的 catch 块。如果你调用其中一个“note”函数, 但是,当前正在处理一个异常,那么您的程序将调用 terminate() .

    您的新代码也可以。捕获所有内容,然后调用另一个函数返回到更具体的处理程序是可以的。那是 the exception dispatcher idiom described in the C++ FAQ . 重新引发异常看起来有点奇怪 之后 调度块已完成,但如果相同 陈述发生在 noteError 返回(在原始文件中 抓住 块)而不是它现在的位置,那么它将是非常普通的;它在标准15.1/6中得到了证明。