关于捕获异常良好做法

Geo*_*roy 15 c++ exception try-catch rvalue-reference c++11

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

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

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

在代码中,这给:

1)

try { throw std::exception{"what"}; }
catch (std::exception& ex) {}
Run Code Online (Sandbox Code Playgroud)

2)

try { throw std::exception{"what"}; }
catch (const std::exception& ex) {}
Run Code Online (Sandbox Code Playgroud)

3)

try { throw std::exception{"what"}; }
catch (std::exception&& ex) {}
Run Code Online (Sandbox Code Playgroud)

4)

try { throw std::exception{"what"}; }
catch (const std::exception&& ex) {}
Run Code Online (Sandbox Code Playgroud)

How*_*ant 32

你应该通过const lvalue reference(2)来捕获:

try { throw std::exception{"what"}; }
catch (const std::exception& ex) {}
Run Code Online (Sandbox Code Playgroud)

理由:

在C++ 11中,有可能(通过使用shared_future)两个线程可以同时展开相同的异常.shared_future除非您控制整个应用程序,否则即使您不知道被使用,也可能在代码中发生这种情况.

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

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