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).
| 归档时间: |
|
| 查看次数: |
2897 次 |
| 最近记录: |