【问题标题】:The parameter for the 'catch' [duplicate]'catch' 的参数 [重复]
【发布时间】:2013-05-09 22:20:54
【问题描述】:

我阅读了“编程:使用 C++ 的原理和实践”一书(Bjarne Stroustrup)。有时作者写道:

catch (runtime_error e)

但有时他会写道:

catch (runtime_error& e)

据我所知,第一个变体创建源的副本,但第二个使用链接。还是我弄错了?在这种情况下,这对“捕获”不重要吗?

【问题讨论】:

  • 第二个通过引用捕获。您需要先了解什么是参考文献,然后阅读我作为副本链接的文章。

标签: c++


【解决方案1】:

你应该总是通过引用来捕捉;绝对没有理由按价值捕捉。

不要相信所写的一切。 ;-)

【讨论】:

  • 但它是由 Bjarne Stroustrup 撰写的。他不太可能弄错了。
  • 为什么?我不时按价值捕捉。例如,如果您正在捕获 int,我看不出有任何理由使用该引用。
  • @JamesKanze:一,投掷 int 有点奇怪,不是吗?第二,即使在这种情况下,通过引用捕获也不会伤害,反之则不然。 (也就是说,按值捕获有缺点,按引用捕获没有;这就是我所说的。)在问答页面的快速简短环境中,我更喜欢给出简单的规则,不能把你踢到脚,而留下详细的解释在咖啡室休息时间。 ;-)
  • @DevSolar 抛出int 是干净地退出程序的好方法,前提是main 知道约定。 (int 是返回码。)我认为您应该在 catch 中使用与函数参数相同的约定。
  • @DevSolar:我不会抛出int(因为处理程序中没有说明它的含义);但是抛出一个合理命名的枚举,或者一个包含一两个简单类型的结构,对我来说似乎很合理,而且这样的事情可能更好地被价值捕获。简单的指南确实很有帮助;像“绝对没有理由”这样的过于简单化的说法就不那么简单了。
【解决方案2】:

我预计大多数时候,他会使用:

catch ( runtime_error const& e )

按值捕获和按引用捕获的区别是 与按值传递和按引用传递完全相同 一个函数参数。最重要的区别在于 通过引用捕获时,动态类型可以是 派生类型,按值将导致切片(因为 复制)。

另外,如果你通过非常量引用捕获,并修改 异常对象,然后重新抛出,就是修改后的对象 会传播。

【讨论】:

    【解决方案3】:

    为了避免不必要的复制AND slicing,您应该始终通过引用捕获异常。尤其是在你打算重新throw;它的情况下。

    【讨论】:

      【解决方案4】:

      按价值捕获

      catch (runtime_error e)

      与通过引用捕获

      catch (runtime_error& e)

      当您拥有(通常是多态的)异常类层次结构并且希望在单个 catch 子句中捕获所有派生类型的异常时,您会使用后者。

      例如,标准库中的所有异常类都派生自std::exception,因此您可以这样做:

      try {
          int i;
          std::cin >> i;
          switch (i) {
              case 1:  throw std::range_error();
              case 2:  throw std::overflow_error();
              case 3:  throw std::undefflow_error();
              default: throw std::logic_error();
          }
      } catch (std::exception& e) {
          // handle all the exceptions the same way,
          // but print a diagnostic message polimorphicaly
          std::cout << "I caught: " << e.what() << '\n';
      }
      

      如果您通过引用而不是按值捕获,您将始终捕获一个std::exception,从对象的派生部分切下。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-08
        • 2017-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-10
        相关资源
        最近更新 更多