假设我有不同的函数,可以抛出异常:
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");
}
答案 0 :(得分:8)
我必须承认,我发现组合lambdas和宏非常有趣。
#define TRY_CATCH_BLOCK(...) \
[&]() -> decltype(auto) { \
try { \
return __VA_ARGS__; \
} catch(/* ... */) { \
/* Handle and rethrow */ \
} \
}()
这可以像你指定的一样调用,包括在另一个函数调用中交错。
some_func(TRY_CATCH_BLOCK(func_foo(...)));