2011-09-28 45 views
14

我正在用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) {} 
+1

通過右值引用捕獲甚至是非法http://stackoverflow.com/q/21977340/5447906 –

回答

31

你應該const的左值參考(2)趕上:

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

理由:

在C++ 11它是可能的(通過使用shared_future)那兩個線程可能會同時解除相同的異常。即使您不知道使用shared_future,也可能發生在代碼中,除非您控制整個應用程序。

如果兩個線程同時捕捉到相同的異常,並且其中一個或兩個線程修改了異常,那麼您就有競爭狀態。

因此,只要您不必修改catch子句中的異常對象,就讓編譯器爲您執行該策略 - 趕上const&。如果確實需要修改異常,請複製它,修改副本並丟棄副本。如果您確信這不會分割您的異常對象(如果您正在捕獲std::exception,通常不會發生),您可以通過按值捕獲來實現此目的。

+0

謝謝你的回答,這真的很有幫助和清楚。 – Geoffroy

1

我想應該通過左值引用來以通常的方式捕獲異常。的右值引用Here's很好的解釋使用