C++中的異常對象的範圍是什麼? catch處理程序執行後它是否超出範圍?另外,如果我創建一個未命名的異常對象並將其拋出,那麼在捕獲該異常時,如果我通過const引用或非const引用來捕獲異常,它會影響嗎?C++中的異常對象的範圍
32
A
回答
32
當計算throw
表達式時,會從表達式的值中初始化一個異常對象。拋出的異常對象從throw表達式的靜態類型中忽略任何const
和volatile
限定符。對於類類型,這意味着執行複製初始化。
異常對象的作用域超出了引發塊的範圍。可以把它看作是居住在一個特殊的異常區域,在正常調用堆棧的一邊,而本地對象居住的地方。
在catch
塊中,使用此異常對象初始化使用捕獲的異常對象初始化的名稱,而不是throw
的參數,即使這是左值也是如此。
如果你通過非const引用catch
,那麼你可以改變異常對象,但不是它初始化的內容。如果您重新拋出異常的方式可能會改變程序的行爲,如果您通過值或常量引用捕獲異常(不包括const_cast
)。
當最後一個catch塊沒有通過重新拋出(即無參數拋出表達式求值)完成時,異常對象被銷燬。
4
8
異常對象僅在catch
塊中可用。您不能在catch
塊之外使用異常對象。
try
{
MyException anObject;
throw anObject; //1
}
catch(MyException exObject)
{
}
- 的
throw
條款(// 1)接收本地對象anObject
,並把它作爲一個值參數:當你拋出一個異常和catch以下步驟發生它會創建anObject
的副本。 catch
處理程序捕獲一個MyException對象,它又是一個值參數。此時將創建另一個副本。- 如果
catch
處理程序已經實現以便接收對象(catch (MyException &o))
的引用,則避免第二個副本。 - 如果
catch
處理程序通過const&
接收到異常對象,那麼您只能調用const
方法。
相關問題
- 1. WinRt C#空異常 - 使用IAsyncOperationWithProgress的對象範圍問題
- 2. C++超出範圍異常
- 3. 指數超出範圍的異常 - C#
- 4. Java中的對象範圍內的對象範圍
- 5. C++對象生命範圍
- 6. C++對象指針範圍
- 7. 對象範圍DI C#
- 8. JSP中對象的範圍
- 9. Objective-c子字符串範圍異常
- 10. c#異常索引超出範圍
- 11. C#索引超出範圍異常
- 12. Mapper類中超出範圍的異常
- 13. 對象的範圍,objective-c,CLLocationManager
- 14. 發生異常我的c#項目中的參數範圍
- 15. Symfony2:範圍擴展異常
- 16. 焊接CDI範圍異常
- 17. 指數範圍異常
- 18. C#中的參數超出範圍異常錯誤#
- 19. C中的動態列表超出範圍異常#
- 20. 處理對象的範圍
- 21. 範圍本地對象的
- 22. 如何從VBA中的範圍對象中選擇子範圍?
- 23. 異常當範圍上的角度範圍曝光$ window.print
- 24. 超出範圍的異常,但索引在範圍內! WP 7.1
- 25. 指向對象的指針指向C++對象範圍之外
- 26. 從範圍(對象)
- 27. Scala:對象範圍
- 28. Javascript對象範圍
- 29. Java對象範圍
- 30. 交易範圍內的異常處理
你問的是*生命*嗎? – Joren 2009-10-31 11:45:23
是的,它會在什麼時候被破壞? – Naveen 2009-10-31 11:46:45
澄清Joren的問題:術語_scope_通常指的是變量名稱所在的區域(代碼行)。單詞_scope_通常被誤用爲_lifetime_,就像你所理解的那樣,變量實際上駐留在內存中的時間有多長。 – Thomas 2009-10-31 12:06:55