2

我想知道是否有可能(通过巧妙的转换规则)编写一个“异常”类来帮助解决以下问题:

而不是写:

try {
 ...
} catch (std::execption const e) {    // StdLib exceptions
} catch (CException* pEx) {           // MFC exceptions
} catch (CORBA::Exception const& e) { // CORBA exceptions
} // note handling code inside catch blocks omitted for brevity

如果可以构造一个像这样工作的类型,那就太好了:

try {
  ...
} catch( magic_exception_handle const& e) { // catches all three types mentioned above
  const std::string msg = e.what(); // could also provide generalized message extraction
}

这可能吗?如何?

注意:我不喜欢的其他解决方案:

  • 我可以,catch(...)但我不想包罗万象。
  • 捕获处理函数:

    void handler3() {
      try {
        throw;
      } catch (std::execption const e) {    // StdLib exceptions
      } catch (CException* pEx) {           // MFC exceptions
      } catch (CORBA::Exception const& e) { // CORBA exceptions
      } // note handling code inside catch blocks omitted for brevity
    }
    
    ...
    try { ... } catch(...) { handler3(); }
    

    也不削减它,因为虽然任何其他异常都会向外抛出,但它首先会捕获任何其他异常,这会导致在重新抛出之前过早地展开堆栈。(这对于 Windows 上产生的任何崩溃转储都非常不方便。)

  • 我可以为 catch 块编写一个宏。(

那么,是否可以创建magic_exception_handle类型?已经完成了吗?

4

1 回答 1

1

您唯一真正的选择是反转逻辑:

template<typename F, typename... Args>
auto convert_exceptions(F &&f, Args... &&args)
-> decltype(f(std::forward<Args>(args)...)) {
   try {
      return f(std::forward<Args>(args)...));
   } catch (std::exception const e) {    // StdLib exceptions
      std::throw_with_nested(magic_exception{...});
   } catch (CException* pEx) {           // MFC exceptions
      std::throw_with_nested(magic_exception{...});
   } catch (CORBA::Exception const& e) { // CORBA exceptions
      std::throw_with_nested(magic_exception{...});
   }
}

你现在可以写:

try {
   convert_exceptions([&]() {
      // ...
   });
} catch (const magic_exception &e) {
   // ...
}
于 2013-04-30T14:58:25.123 回答