回答
拋出的值將拋出的值複製到實現定義的位置。
因此,該值被複制到throw(這意味着該類型必須是可複製的)。
當你發現你可以選擇按價值或參考捕獲。
catch(X val) // Catch by value
{
}
catch(Y& val) // Catch by reference
{
}
習慣性的爲什麼要趕上const引用。這是因爲,如果按值捕獲,當異常從其保存的位置複製到捕獲值時,可能會發生切片。如果按值捕獲,則該值在catch塊的末尾被銷燬。保存位置的副本在try/catch塊的末尾被銷燬(並且不會被重新拋出)。
所以,當你碰到catch(...)
什麼都沒有發生。異常保留在異常已被複制到的未指定位置。
當你使用throw來重新拋出異常。 throw;
。由於異常已經在未指定的位置並且什麼都不需要發生,因此再次沒有任何反應。
注意:在沒有異常傳播時調用throw;
是錯誤,並且會導致調用std :: terminate。
關於問題提出的「catch(...){throw;}」怎麼樣? – 2012-03-05 06:43:05
@MooingDuck:對不起,我只是想首先解釋主要部分的上下文。 – 2012-03-05 06:53:01
你總是抓住你拋出的東西。 假設你有一個異常類
class MyException { public: int m_data; MyException(int data) { printf("MyException::MyException() ctor\n"); m_data = data; } MyException(const MyException & other) { printf("MyException::MyException() copy ctor\n"); } ~MyException() { printf("MyException::~MyException() dtor\n"); } };
1)如果你拋出一個指針,你會得到指針:
例1:
void f() { throw new MyException() } void main() { try{ f(); } catch(MyException * ex) // You WILL catch the pointer { delete ex; // You should delete the exception object } catch(MyException & ex) // You WILL NOT catch the pointer { } }
例2:
void main() { try{ f(); } catch(...) // You WILL catch the pointer, but will be unable to access it { throw; // You are rethrowing the pointer } }
2)如果已拋出的對象時,你會趕上對它的引用:
實施例1:
void f() { printf("f BEGIN\n"); throw MyException(1); // MyException ctor is called printf("f END\n"); } void main() { printf("main BEGIN\n"); try { f(); } catch(MyException & ex) // You WILL catch a reference to created object { printf("catch MyException: %d\n", ex.m_data); } // MyException dtor is called here!! printf("main END\n"); }
以下輸出產生:
main BEGIN
f BEGIN
MyException::MyException() ctor
catch MyException: 1
MyException::~MyException() dtor
main END
實施例2:
void main() { try { f(); } catch(...) // You WILL catch a reference to created object, //but will be unable to access it { throw; // You throw the reference } }
- 1. 在try/catch語句C#Monitor.Exit
- 2. Catch-all或默認路由
- 3. C語言中的try-catch語句C
- 4. C#using語句catch錯誤
- 5. 在C#中哈希表是通過引用或按默認值傳遞的?
- 6. C#執行try和catch
- 7. 使用try catch語句打印語句
- 8. 在catch塊中使用continue語句
- 9. 使用try/catch語句進行更新
- 10. 如何繼續嘗試catch語句的執行java中
- 11. catch語句之前的返回語句
- 12. 嘗試 - 雙Catch語句Java
- 13. 和try/catch語句嵌套
- 14. Javascript:try/catch/finally return語句
- 15. 在try/catch語句中發生錯誤
- 16. 錯誤在做catch語句中迅速
- 17. 爲什麼在Haskell case語句中默認的catch-all不是強制的?
- 18. 按值或按引用在目標中傳遞參數C
- 19. 在PHP中嘗試catch語句,其中文件不上傳
- 20. C#:多個catch子句
- 21. 奇怪的catch子句... C++
- 22. 沒有錯誤,但沒有執行後嘗試catch語句
- 23. 這兩個承諾/塊的catch語句都沒有執行
- 24. 如果語句內的try catch語句沒有檢測到try/catch部分
- 25. c# - 將catch語句塊中的2條語句合併成一個語句
- 26. 如何正確使用try-catch語句
- 27. try catch語句的作用域問題
- 28. 多個語句在try/catch塊 - Java的
- 29. 多個IF語句在catch塊回滾
- 30. C++ catch塊 - 通過值或引用捕獲異常?
如果一個寫'趕上(...){拋出; },那麼它將如何通過價值或借鑑來重新拋出?請注意,在這種情況下,沒有捕捉到原始對象。 – Nawaz 2012-03-05 05:43:22
按價值,還是參考? – Nawaz 2012-03-05 05:45:06
我特別覺得大膽的部分與catch(...)'混淆:*「用throw拋棄;拋出原始對象**,如果最初的異常被引用**捕獲或者在catch-all中被調用,並且「** – Nawaz 2012-03-05 05:46:24