29 C Primer 4th 筆記,異常處理

2022-02-12 11:11:32 字數 3211 閱讀 2820

1、類成員的指標不同於指向普通資料或函式的指標,普通指標只根據物件或函式的型別而變化,而成員的指標必須反映成員所屬的類。

2、異常是通過丟擲物件而引發的。該物件的型別決定應該啟用哪個處理**。

被選中的處理**是呼叫鏈中與該物件型別匹配且離丟擲異常位置最近的那個。

異常以類似於將實參傳遞給函式的方式丟擲和捕獲。異常可以是可傳給非引用形參的任意型別的物件,這意味著

必須能夠複製該型別的物件。

傳遞陣列或函式型別實參的時候,該實參自動轉換為乙個指標。被丟擲的物件將發生同樣的自動轉換,因此,不存在陣列或函式型別的異常。相反,

如果丟擲乙個陣列,被丟擲的物件轉換為指向陣列首元素的指標,類似地,如果丟擲乙個函式,函式被轉換為指向該函式的指標。

3、一般而言,在處理異常的時候,丟擲異常的塊中的區域性儲存不存在了。當丟擲乙個異常的時候,

被丟擲物件的靜態編譯時型別將決定異常物件的型別。

無論指標所指的物件的實際型別是什麼,

異常物件的型別都與指標的靜態型別相匹配。

4、丟擲指標通常是個壞主意。

5、尋找匹配

catch

的過程中,如果找不到,則退出當前函式

(釋放當前函式的記憶體並撤銷區域性物件),並且繼續在呼叫函式中查詢

。6、棧展開

(stack unwinding)

:沿巢狀函式呼叫鏈繼續向上,直至為異常找到乙個

catch

子句。7、

析構函式應該從不丟擲異常。

在為某個異常進行棧展開的時候,析構函式如果又丟擲自己的未處理的另乙個異常,將會導致呼叫標準庫terminate

函式。一般而言,terminate

函式將呼叫

abort

函式,強制從整個程式非正常退出。

8、如果找不到匹配的

catch,

程式就呼叫庫函式

terminate。9、

在查詢匹配的 catch

期間,找到的

catch

不必是與異常最匹配的那個

catch

,相反,將選中第乙個找到的可以處理該異常的

catch

。因此,在

catch

子句列表中,最特殊的 catch

必須最先出現。

10、除下面幾種可能的區別之外,異常的型別與

catch

說明符的型別必須完全匹配:

• 允許從非 const

到 const

的轉換。也就是說,非

const

物件的

throw

可以與指定接受

const

引用的

catch

匹配。• 允許從派生型別型到基類型別的轉換。

• 將陣列轉換為指向陣列型別的指標,將函式轉換為指向函式型別的適當指

針。在查詢匹配 catch

的時候,不允許其他轉換。具體而言,既不允許標準算術

轉換,也不允許為類型別定義的轉換。

11、如果catch

子句處理因繼承而相關的型別的異常,它就應該將自己的形參定義為引用。

12、空

throw

語句將重新丟擲異常物件,它只能出現在

catch

或從catch

呼叫的函式中。如果在處理**不活動時碰到空

throw

,就呼叫

terminate

函式。被丟擲的異常是原來的異常物件,而不是catch

形參。當

catch

形參是基類型別的時候,我們不知道由重新丟擲表示式丟擲的實際型別,

該型別取決於異常物件的動態型別,而不是 catch

形參的靜態型別。

例如,來自帶基類型別形參 catch

的重新丟擲,可能實際丟擲乙個派生型別的物件。

一般而言,catch

可以改變它的形參。在改變它的形參之後,如果

catch

重新丟擲異常,那麼,只有當異常說明符是引用的時候,才會傳播那些改變。

示例

catch (my_error &eobj)  catch (other_error eobj)
13、捕獲所有異常

catch(...)

14、在進入建構函式函式體之前處理建構函式初始化式,建構函式函式體內部的

catch

子句不能處理在處理建構函式初始化時可能發生的異常。為了處理來自建構函式初始化式的異常,必須將建構函式編寫為函式

try塊。可以使用函式測試塊將一組

catch

子句與函式聯成乙個整體。

示例

template handle::handle(t *p)

try : ptr(p), use(new size_t(1))

catch(const std::bad_alloc &e)

15、exception

型別所定義的唯一操作是乙個名為

what

的虛成員,該函式返回

const char*

物件,它一般返回用來在丟擲位置構造異常物件的資訊。

16、異常安全

(exception safe)

如果在類的成員函式/

或普通函式中申請了記憶體,而在執行函式的中途出現異常,則不會執行程式末尾的釋放記憶體的語句,這會出問題,稱為異常不安全。

所謂異常安全是指,即使發生異常,程式也能正確操作,被分配的任何資源都適當地釋放。

通過定義乙個類來封裝資源的分配和釋放,可以保證正確釋放資源,這一技術稱為「資源分配即初始化」,稱為raii。示例

class resource 

~resource()

// also need to define copy and assignment

private:

resource_type *r; // resource managed by this type

resource_type *allocate(parms p); // allocate this resource

void release(resource_type*); // free this resource

};

可能存在異常的程式以及分配資源的程式應該使用類來管理那些資源。

18 C Primer 4th 筆記,複製控制

1 顯式建構函式 複製建構函式是一種特殊建構函式,具有單個形參,該形參 常用 const 修飾 是對該類型別的引用 當定義乙個新物件並用乙個同型別的物件對它進行初始化時,將顯式使用複製建構函式。當將該型別的物件傳遞給函式或函式返回該型別的物件時,將隱式使用複製建構函式。編譯器自動執行類中非stati...

C Primer 5th學習筆記4 異常語句

c 語言中,異常處理包括以下幾種 try語句的通用語法形式是 try catch exception declaration catch exception declaration c 標準庫中定義了一組類,用於報告標準庫函式遇到的問題。這些類分別定義在以下四個標頭檔案中 exception 最常見...

c primer 4th中習題4 8的答案

比較兩個vector是否相等的 當輸入兩組相同的數時就會出現異常 問題就出在這裡,當輸入的 ivec1 和 ivec2 的內容相等時,比如都是 1 2 3 時,在執行到 while 迴圈時,比較 ivec1 和 ivec2 的對應數值是否相等,如果相等的話,則迭代器 iter1 和 iter2 都做...