異常處理程式

異常處理程式

異常處理程式(catch函式)必須緊跟在try塊之後。當某個異常被拋出,異常處理機制會按照catch塊的代碼順序依次尋找匹配的catch塊。一旦找到一個相匹配的catch塊,則系統認為該異常已得到處理。

異常處理程式的格式

C++使用一種專門的以保留字try開頭的結構來定義。try結構包含一個稱為try子句的複合語句和一系列異常處理程式。複合語句定義了後面異常處理程式的作用域。這一結構的一般形式是:

每一個catch函式就是一個異常處理程式。catch函式可以只有一個形式參數,與C++中函式定義中的形式參數相似,包括可以是一個省略號(…)。帶有省略號形式參數的異常處理程式,是捕獲所有異常的處理程式,對於任何異常f如果沒有找到合適的異常處理程式就被使用。形式參數也可以是不加修飾的類型說明,例如float,就像在函式原型中一樣。在這種情況下,形式參數的唯一用途是唯一標識該異常處理程式。當關於異常的信息被傳遞給異常處理程式時,形式參數包含了一個用於異常信息傳遞的變數名。由於參數的類可以是任意的用戶自定義類,參數可以包含任意所需數目的數據成員。

在C++中,異常處理可以包含任意的C++代碼。

異常與處理程式的綁定

C++的異常只能顯式地由語句throw拋出,throw的一般形式用EBNF表示為:

throw[表達式];

方括弧是元符號,用於表示表達式是可選的。沒有運算元的throw只能出現在異常處理程式中,當它出現的時候再次拋出異常,使異常在別處被處理。這種作用與Ada是完全一樣的。

throw表達式的類型選擇了特定的異常處理程式,這個異常處理程式當然必須有“相匹配”類型的形式參數。在這裡,“相匹配”的意義是:形式參數為類型T、const T、T&(對類型T的對象的引用)或const T&的異常處理程式,與類型為T的表達式的throw相匹配。當T是類時,參數為類型T或任何T的祖先的異常處理程式可以匹配。

在try結構中拋出的異常使try結構中代碼的執行立即結束,從緊跟在try結構的異常處理程式開始,搜尋相匹配的處理程式。搜尋匹配的過程對多個異常處理程式依次進行,直到找到匹配,即如果在完全匹配的異常處理程式之前有任何其他匹配的,那么不會用完全匹配的異常處理程式。因此,用於特定異常的處理程式放在異常處理程式列表的最上面,後面跟更通用的異常處理程式。最後一個異常處理程式通常以省略號(…)為形式參數,它匹配任意的異常,這可保證所有異常都會被捕獲。

如果在try子句中拋出異常,並且沒有相匹配的異常處理程式與這個try子句相關聯,異常就會傳播。如果try子句內嵌在另一個try子句中,異常就會傳播到與外層時子句相關聯的異常處理程式。如果包圍在外面的try子句都沒有相匹配的異常處理程式,異常就傳播到拋出異常的函式的調用者。如果對函式的調用不在一個try子句中,異常就傳播到函式的調用者。如果在這個傳播過程中沒有在程式中找到相匹配的異常處理程式,就會調用默認的異常處理程式。

相關詞條

相關搜尋

熱門詞條

聯絡我們