捕获从其参数抛出的函数中的异常

时间:2013-01-26 09:01:42

标签: c++ function exception c++11

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

3 个答案:

答案 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())

中得出一些结论
  1. foo2的返回值应可转换为int
  2. foo不需要知道foo2的参数数量及其类型,甚至不需要知道foo之前调用的函数
  3. 所以我认为 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;
    }