void foo(int arg);
int foo2() {throw std::out_of_range("error!"); return 5;}
//Now I do this like that:
try { foo(foo2()); }
catch(std::out_of_range) {}
我想做的是捕获foo函数中的异常。但是我不知道如何将try块放在参数列表中?
答案 0 :(得分:2)
你不能,因为在执行foo()
之前不会抛出异常。
答案 1 :(得分:2)
你做不到。您需要将对foo2
的调用拉出foo
,并在调用例程中处理异常,因此 -
int param;
try {
param = foo2();
} catch(std::out_of_range) {}
foo(param);
或将foo2
作为foo
的函数传递,并在foo
内对其进行评估,如下所示 -
void foo(int (*arg_func)()) {
int arg;
try {
arg = arg_func();
} catch(std::out_of_range) {
std::cout << "out of range ";
}
}
然后呼叫看起来像这样 -
foo(foo2);
当然,现在你总是要把一个函数传递给foo
,没有文字或表达。
答案 2 :(得分:1)
大多数时候,我更喜欢@ iagreen的解决方案。但在他/她的解决方案中,存在依赖性问题:
foo
知道foo2
的签名吗?当然,我们可以在原始电话foo(foo2())
foo2
的返回值应可转换为int foo
不需要知道foo2
的参数数量及其类型,甚至不需要知道foo
之前调用的函数所以我认为 Variadic Template 的实现在大多数情况下更合适。
template < typename F, typename... Args >
void foo( F f, Args&&... args ) {
int ret = f( std::forward<Args>(args)... );
std::cout << "ret = " << ret << std::endl;
}