【问题标题】:Catching exception in function thrown from its arguments捕获从其参数抛出的函数中的异常
【发布时间】:2013-01-26 09:01:41
【问题描述】:
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 块放入参数列表中?

【问题讨论】:

  • 你不能,在 foo 开始执行之前抛出异常。例如,您需要让 foo 自己调用 foo2。
  • @Marc Glisse 好的,谢谢。

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


【解决方案1】:

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

【讨论】:

    【解决方案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,而不是文字或表达式。

    【讨论】:

      【解决方案3】:

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

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

      当然我们可以在你原来的电话foo(foo2())得到一些结论

      1. foo2 的返回值应该可转换为 int
      2. 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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-07
        • 1970-01-01
        • 2011-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多