18.1 異常處理
- 異常處理機制,允許程序獨立開發的部分能夠在運行的時候出現的問題進行通信并且做出相應的處理,異常的處理使得我們可以將問題的檢測和處理分離開來。程序的一部分負責檢測問題的出現,然后將解決這個問題的任務傳遞給程序的另一部分。負責檢測的環節無法處理模塊的所有細節,反之亦然。
- 處理異常,最核心關鍵的問題:拋出異常時發生了什么、捕獲異常時發生了什么、用來傳遞錯誤的對象的意義
18.1.1 拋出異常
- C++通過拋出一個表達式來引發一個異常。被拋出的表達式的類型和當前的調用鏈決定了針對異常使用哪段代碼來處理。在這個過程中會涉及調用鏈和拋出的異常最近匹配的過程
- 當執行一個throw的時候,跟在throw后面的語句不會被執行。相反程序的控制權會從throw轉移給與之相互對應的catch模塊,這個catch模塊可能是一個局部的catch,也可能是位于直接或者間接調用發生異常的函數的另外一個函數。
- 控制權從一處轉移到另外一處的含義:1,沿著調用鏈的函數可能提早退出;2,一旦程序開始執行異常處理代碼,則沿著調用鏈的創建的對象將會被銷毀。
- throw的用法和return類似,他通常作為條件語句的一部分或者作為某個函數的最后(唯一)一條語句
棧展開
- 拋出一個異常的時候,程序會暫停當前函數的執行過程,并且立刻尋找和異常相互匹配的catch語句。當throw出現在一個try語句塊中,檢查和該try塊關聯的catch語句。如果有匹配的catch,則使用該catch處理異常。如果沒有匹配的catch,而且try嵌套在其他的try中,則繼續檢查和外層相互匹配的catch語句,如果還是沒有catch語句,則退出當前的函數,在調用前函數的外層函數繼續尋找
- 上述的過程稱為棧展開,棧展開的過程沿著嵌套函數的調用鏈不斷查找,直到找到一個與異常相互匹配的catch語句為止,如果一直沒有找到,則退出主函數終止查找過程。
- 發生了異常,但是沒有找到與之相互對應的catch時,程序將會調用terminate函數,終止程序的執行。
參考鏈接
- http://c.biancheng.net/cpp/biancheng/view/3283.html