如何用try / catch块包装调用?

时间:2016-11-08 12:34:39

标签: c++

假设我有不同的函数,可以抛出异常:

const Foo& func_foo(...);  // Can throw exceptions
const Bar& func_bar(...);  // Can throw exceptions
const FooBar& func_foobar(...); // Can throw exceptions

我在代码中有不同的地方,可以通过以下方式使用这些功能:

some_func(/*applying of func_foo or func_bar or func_foobar*/(...)) 

实际上,我在不同功能的许多地方立即使用功能结果。

使用try / catch块包装func_foo / func_bar_func_foobar函数的最佳方法是什么,而无需全局重写其他代码片段?

理想情况下我想使用类似的东西(例如调用func_foo)

some_func(TRY_CATCH_BLOCK(func_foo(...)));

catch处理程序将传播具有不同类型的异常

catch (const ExceptionFoo& e)
{
   throw SomeException1("Some message from e");
}
catch (const ExceptionBar& e)
{
   throw SomeException2("Some message from e");
}

1 个答案:

答案 0 :(得分:8)

我必须承认,我发现组合lambdas和宏非常有趣。

#define TRY_CATCH_BLOCK(...)         \
    [&]() -> decltype(auto) {        \
        try {                        \
            return __VA_ARGS__;      \
        } catch(/* ... */) {         \
            /* Handle and rethrow */ \
        }                            \
    }()

这可以像你指定的一样调用,包括在另一个函数调用中交错。

some_func(TRY_CATCH_BLOCK(func_foo(...)));

See it live on Coliru