在大多數情況下,try和catch塊工作得很好,但有乙個特殊情況,它們是不夠的。請考慮以下示例:
class a};
class b : public a};
int main()
catch (int)
}
在上面的例子中,派生類b呼叫基類建構函式a,它可以引發異常。因為物件b的建立已經放在try塊中(在函式main()中),如果a丟擲異常,main的try塊將捕獲它。因此,該程式列印:
oops
但是如果我們想要捕獲b內部的異常怎麼辦?在呼叫b建構函式的主體之前,對建構函式a的呼叫通過成員初始化列表進行。沒有辦法圍繞它包裝乙個標準的try塊。
在這種情況下,我們必須使用乙個稍微修改過的try塊,稱為函式try塊。
函式try塊
函式try塊旨在允許您在整個函式的主體周圍建立異常處理程式,而不是圍繞**塊。
函式try塊的語法有點難以描述,因此我們將通過示例顯示:
#include class a};
class b : public a
catch (...) //請注意,這與函式本身處於相同的縮排級別 };
int main()
catch (int)
}
執行此程式時,它會生成輸出:
construction of a failed
oops
讓我們更詳細地研究一下這個程式。
首先,請注意在成員初始化列表之前新增「try」關鍵字。這表明應該在try塊內部考慮該點之後的所有內容(直到函式結束)。
其次,請注意關聯的catch塊與整個函式處於相同的縮排級別。try關鍵字和函式體末尾之間丟擲的任何異常都有資格在此處捕獲。
最後,與普通的catch塊不同,它允許您使用函式級try塊解析異常,拋出新異常或重新拋出現有異常,您必須丟擲或重新丟擲異常。如果您沒有顯式拋出新異常,或者重新丟擲當前異常(使用throw關鍵字本身),異常將在堆疊中隱式重新丟擲。
在上面的程式中,因為我們沒有從函式級catch塊中顯式丟擲異常,所以異常被隱式重新丟擲,並被main()中的catch塊捕獲。這就是上述程式列印「糟糕」的原因!
雖然函式級別try塊也可以與非成員函式一起使用,但它們通常不是因為很少需要這樣的情況。它們幾乎只與建構函式一起使用!
不要使用函式嘗試清理資源
當構造物件失敗時,不會呼叫類的析構函式。因此,您可能會嘗試使用函式try塊作為清除在失敗之前部分分配資源的類的方法。但是,引用失敗物件的成員被認為是未定義的行為,因為該物件在執行catch塊之前是「死」。這意味著您無法使用函式嘗試在類之後進行清理。
函式try主要用於在將異常傳遞到堆疊之前記錄失敗,或者用於更改丟擲的異常型別。
C 基礎教程物件導向(學習筆記5(2))
在編寫具有多個建構函式的類 大多數建構函式 時,必須為每個建構函式中的所有成員指定預設值會導致冗餘 如果更新成員的預設值,則需要觸控每個建構函式。從c 11開始,可以直接為普通類成員變數 不使用static關鍵字的變數 提供預設初始化值 class rectangle void print int ...
C 基礎教程物件導向(學習筆記(23))
過載一元運算子 與您目前看到的運算子不同,正 負 和邏輯非 運算子都是一元運算子,這意味著它們只能在乙個運算元上執行。因為它們僅對它們所應用的物件進行操作,所以通常將一元運算子過載實現為成員函式。所有三個運算元都以相同的方式實現。讓我們看一下我們如何在前面的例子中使用的cents類上實現operat...
C 基礎教程物件導向(學習筆記(24))
過載比較運算子相對簡單,因為它們遵循我們在過載其他運算子時看到的相同模式。因為比較運算子都是不修改左運算元的二元運算子,所以我們將使過載的比較運算子宣告為友元函式。這是乙個帶有過載運算子 和operator!的car類的示例。include include class car friend bool...