【问题标题】:Is there any reason to catch an exception by value? [duplicate]是否有任何理由按值捕获异常? [复制]
【发布时间】:2013-07-16 19:47:08
【问题描述】:

Sutter 和 Alexandrescu 的编码标准 tell us 通过引用捕获异常。

当然,像这样的一揽子推荐通常偶尔会有例外(不是双关语)。是否存在应该首选按值捕获异常的用例?

【问题讨论】:

  • @LeonLi 不,这个问题是问哪个通常更好。这个问题已经说明了这个答案是一个前提。
  • 什么?那 q only 谈论指针,这没有提到。这个问题不是关于其他人解决的最佳实践,而是关于已经超出公认最佳实践的特定案例。

标签: c++ exception-handling


【解决方案1】:

除了不需要可复制性或执行复制(可能是切片)的明显原因之外,捕获引用的好处是您可以修改它并使用throw; 继续处理。

如果您想修改对象,但在 未修改 对象上继续使用 throw; 处理异常,则必须进行复制,其中一种方法是按值捕获.

不过,我认为这很做作。捕捉const 引用,后跟一个明确的副本会更好地表达意图。

另请注意,抛出新的 C++11 nested_exception 会将先前抛出的异常对象,而不是按值接收的对象嵌套在新异常中。在这种情况下,您可能会保留自己对收到的异常的引用,除非您通过引用收到它,否则它会变得陈旧。

【讨论】:

  • 通过引用捕获的另一个原因是避免在抛出派生异常类然后使用基类引用捕获时进行切片。
  • @RemyLebeau 谢谢,已更新。
猜你喜欢
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-10
  • 1970-01-01
  • 2018-09-06
  • 2014-06-19
相关资源
最近更新 更多