C++的異常處理機制主要用于在程序運行時處理錯誤或遇到的非預期情況
try塊:將可能拋出異常的代碼放在try塊中。如果在try塊中的代碼拋出了異常,程序會立即跳轉到相應的catch塊。
catch塊:用于捕獲并處理特定類型的異常。catch塊緊跟在try塊之后,并指定要捕獲的異常類型。當try塊中的代碼拋出異常時,C++運行時會查找與異常類型匹配的catch塊。如果找到匹配的catch塊,程序將執行該catch塊中的代碼。如果沒有找到匹配的catch塊,異常將繼續向上層調用棧傳播,直到被捕獲或導致程序終止。
throw關鍵字:用于顯式拋出異常。在程序中,如果遇到錯誤或非預期情況,可以使用throw關鍵字拋出一個異常對象。通常,異常對象是一個派生自std::exception的類,包含有關異常的詳細信息。
std::exception類:C++標準庫提供了一個名為std::exception的基類,它是所有標準異常類的基類。當創建自定義異常類時,通常繼承自std::exception,并重寫其what()成員函數以提供關于異常的詳細信息。
析構函數是一種特殊的成員函數,它在對象的生命周期結束時被自動調用。析構函數在以下情況下被調用:
析構函數的定義與普通成員函數類似,但需要在類聲明中指定其返回類型為void。析構函數不能有參數,也不能有返回值。在類定義中,析構函數的名稱是在類名后加上波浪線(~)。
以下是一個簡單的C++異常處理示例:
#include <iostream>
#include <stdexcept>
class MyException : public std::exception {
public:
const char* what() const noexcept override {
return "An error occurred";
}
};
void divide(int a, int b) {
if (b == 0) {
throw MyException();
}
std::cout << "Result: " << a / b << std::endl;
}
int main() {
try {
divide(10, 0);
} catch (const MyException& e) {
std::cerr << "Caught exception: " << e.what() << std::endl;
}
return 0;
}
在這個示例中,我們定義了一個名為MyException的自定義異常類,繼承自std::exception。在divide函數中,我們檢查除數是否為零,如果是,則拋出MyException異常。在main函數中,我們使用try-catch塊捕獲并處理MyException異常。