【问题标题】:About catching exception good practices关于捕获异常的良好做法
【发布时间】:2011-11-26 18:07:23
【问题描述】:

我正在用 C++11 编写一个小程序,并且第一次真正使用异常。

我有一个关于如何有效捕获异常的问题,经过一番谷歌搜索后,我仍然没有答案。

这是一个问题: 通过 (const?) 左值引用或 (const?) 右值引用捕获异常更有效(或推荐)的是什么?

在代码中给出:

1)

try { throw std::exception{"what"}; }
catch (std::exception& ex) {}

2)

try { throw std::exception{"what"}; }
catch (const std::exception& ex) {}

3)

try { throw std::exception{"what"}; }
catch (std::exception&& ex) {}

4)

try { throw std::exception{"what"}; }
catch (const std::exception&& ex) {}

【问题讨论】:

标签: c++ exception c++11 try-catch rvalue-reference


【解决方案1】:

你应该通过 const 左值引用来捕捉 (2):

try { throw std::exception{"what"}; }
catch (const std::exception& ex) {}

理由:

在 C++11 中,有可能(通过使用 shared_future)两个线程同时展开同一个异常。即使您不知道正在使用shared_future,这也可能在您的代码中发生,除非您控制整个应用程序。

如果捕获到两个线程同时展开同一个异常,并且其中一个或两个线程修改了异常,那么您就有了竞争条件。

因此,只要您不必修改 catch 子句中的异常对象,就让编译器为您强制执行该策略 - 通过const& 捕获。如果您确实需要修改异常,则对其进行复制,修改副本并抛出副本。如果你确定这不会分割你的异常对象,你可以通过按值捕获来做到这一点(如果你正在捕获std::exception,这通常不是这种情况)。

【讨论】:

    【解决方案2】:

    我认为应该通过左值引用以通常的方式捕获异常。 Here's rvalues-references 使用很好的解释

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      • 2019-11-01
      • 1970-01-01
      • 2011-06-30
      • 2021-07-23
      • 2010-12-25
      • 2019-09-12
      相关资源
      最近更新 更多