C++ primer 第十七章 異常處理部分

1.      異常處理的意義:將問題的檢測和解決分離,這樣問題檢測部分可以不必瞭解如何處理問題。

2.      異常是通過拋出對象而引發的,被選中的處理代碼是調用鏈中與該對象類型匹配而且離拋出位置最近的代碼。

3.      異常是可以傳給非引用形參的任意類型的對象,這意味着必須能複製該類型的對象。

4.      執行throw的時候,不會執行在throw後的語句,而是將控制權從throw轉移到catch,catch可以使同一函數中局部的catch,也可以在直接或間接調用發生異常的函數的另一個函數中。

5.      在處理異常的時候,拋出異常的塊中的局部存儲不存在了。被拋出的對象,用throw表達式初始化一個稱爲異常對象的特殊對象,由編譯器管理,保存在可能被激活的任意catch都可以訪問的空間。異常完全處理之後,撤銷該對象。

6.      拋出指向局部對象的指針是錯誤的,跟從函數返回指向局部對象的指針一樣。

7.      棧展開:拋出異常後,暫停當前函數的執行,開始查找匹配的catch函數。首先檢查throw是否在try內部,如果是,則檢查與該try相關的catch,看是否其中有與被拋出對象相匹配。如果找到,就處理;如果沒有,就退出當前函數,並繼續在調用函數中查找。沿函數調用鏈繼續向上,直至找到一個catch語句。

8.      如果一個塊直接分配資源(new),在釋放資源之前發生異常,在棧展開期間將不會釋放該資源。

9.      析構函數不應該拋出異常,如果又拋出自己的未經處理的另一個異常,將會導致調用標準庫terminate函數。一般來說,terminate函數將調用about函數,強制從整個函數非正常退出。

10.  另外,不能不處理異常。如果找不到匹配的catch,就調用terminate函數。

11.  在查找catch期間,找到的catch不必是最匹配的那個,而是第一個可以處理該異常的catch。所以,在catch子句列表中,最特殊的catch必須最先出現。

12.  除去下面三種情況,異常類型必須與catch說明完全匹配:

·允許從非const到const的轉換

·允許從派生類到基類類型的轉換

·將數組轉換爲指向數組類型的指針

13.  重新拋出:catch將異常傳遞給調用鏈中更上層的函數。方法是,在catch或者catch調用的函數中寫空throw;語句。

14.  捕獲所有異常的catch句:catch(…){ }

15.  函數測試塊:可以使用函數測試塊try{}將一組catch子句與函數連成一個整體。爲了處理來自構造函數初始化的異常,必須將構造函數編寫成測試塊。

16.  資源分配即初始化RAII,通過定義一個類來封裝資源的分配和釋放,可以保證正確釋放資源,如auto_ptr類。

17.  異常說明,跟在函數形參表之後的throw(異常列表)。throw()空列表表示不拋出任何異常。如果沒有指定異常說明,則可拋出任意類型的異常。

18.  如果函數跑出了沒有在異常說明中列出的異常,會調用標準庫函數unexpected,默認情況下,unexpected調用terminate函數。

19.  在const成員函數聲明中,異常說明跟在const之後。

const char* what() const throw();

20.  基類中虛函數的異常說明,可以與派生類中對應虛函數的異常說明不一樣。但是,派生類虛函數的異常說明必須至少與其基類虛函數的異常說明同樣嚴格,或者更嚴格。這樣可保證,在基類指針調用派生類虛函數的時候,派生類的異常說明不會增加新的可拋出異常。

21.  異常說明是函數類型的一部分,這樣,可以在函數指針的定義中提供異常說明

void (*pf) (int) throw (runtime_error);

如果用另一指針pf2初始化函數指針pf1,則pf2的異常說明要至少與pf1一樣嚴格。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章