【问题标题】:Nested try...catch inside C++ exception handler?在 C++ 异常处理程序中嵌套 try...catch?
【发布时间】:2012-02-01 10:57:13
【问题描述】:

我想在我的异常处理程序中执行的代码本身可能会引发异常。

以下结构是合法的 C++ 吗?如果是,有什么缺点吗?

try
{
    // ...
}
catch (const E&)
{
    try
    {
        // ...
    }
    catch (const F&)
    {

    }
}

【问题讨论】:

    标签: c++ exception try-catch


    【解决方案1】:

    不,没有缺点。这就是你应该这样做的方式。

    【讨论】:

      【解决方案2】:

      实际上,甚至还有一种使用嵌套 try/catch 块的有趣技术:假设您有多个函数需要有效地进行相同的异常处理。特别是在包装另一个接口时,这是常见的情况。在这种情况下,可以捕获所有异常,从异常处理程序中调用一个函数,并在此函数中重新抛出异常以实现实际的异常处理:

      void fancy_handler() {
          try {
              throw; // assumes that fancy_handler() is called from catch-clause
          } catch (std::runtime_error const& rt) {
              std::cout << "runtime-error: " << ex.what() << "\n";
          } catch (std::exception const& ex) {
              std::cout << "excption: " << ex.what() << "\n";
          } catch (...) {
              std::cout << "unknown exception\n";
          }
      }
      
      void foo() { try { do_foo(); } catch (...) { fancy_handler(); } }
      void bar() { try { do_bar(); } catch (...) { fancy_handler(); } }
      

      我只是喜欢避免重复 [非平凡] 代码!

      【讨论】:

      • 等等,你真的可以从嵌套函数中throw 吗?我从来没有见过这样的事情!
      • @MooingDuck:只要你从一个 catch-block 调用函数,你就可以重新抛出异常。更有趣的是,这也适用于 Java 和 C#(我最初在 Java 中使用这种技术来处理大量不同的数据库异常;不过,我是 C++ 专家而不是 Java 专家;)
      • 我将不得不查看标准并了解细节和角落。
      • @MooingDuck:我只能告诉你 C++:except.handle 第 7 段:“当 catch 子句的形式参数(如果有)的初始化完成时,处理程序被认为是活动的。”和 except.throw 段落 8:“没有操作数的 throw 表达式重新抛出当前处理的异常 [...]”。
      • 我专门查找的位是int main() {fancy_handler();}
      猜你喜欢
      • 2012-05-04
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 2019-01-07
      相关资源
      最近更新 更多