2
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 块放入参数列表中?

4

3 回答 3

2

你不能,因为在执行之前没有抛出异常foo()

于 2013-01-26T09:04:48.293 回答
2

你不能。您要么需要将调用拉出foo2调用 to 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,而不是文字或表达式。

于 2013-01-26T09:25:02.607 回答
1

大多数时候,我更喜欢@iagreen 的解决方案。但在他/她的解决方案中,存在依赖问题

  • 应该foo知道foo2的签名吗?

当然,我们可以在您最初的通话中得出一些结论foo(foo2())

  1. 的返回值foo2应该可以转换为 int
  2. foo不需要知道foo2's 参数的数量和它们的类型,甚至不需要知道之前调用的函数是什么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;
}
于 2013-01-26T13:00:42.720 回答