C++的異常處理機(jī)制主要用于在程序運(yùn)行時(shí)處理錯(cuò)誤或遇到的非預(yù)期情況
try塊:將可能拋出異常的代碼放在try塊中。如果在try塊中的代碼拋出了異常,程序會立即跳轉(zhuǎn)到相應(yīng)的catch塊。
catch塊:用于捕獲并處理特定類型的異常。catch塊緊跟在try塊之后,并指定要捕獲的異常類型。當(dāng)try塊中的代碼拋出異常時(shí),C++運(yùn)行時(shí)會查找與異常類型匹配的catch塊。如果找到匹配的catch塊,程序?qū)?zhí)行該catch塊中的代碼。如果沒有找到匹配的catch塊,異常將繼續(xù)向上層調(diào)用棧傳播,直到被捕獲或?qū)е鲁绦蚪K止。
throw關(guān)鍵字:用于顯式拋出異常。在程序中,如果遇到錯(cuò)誤或非預(yù)期情況,可以使用throw關(guān)鍵字拋出一個(gè)異常對象。通常,異常對象是一個(gè)派生自std::exception的類,包含有關(guān)異常的詳細(xì)信息。
std::exception類:C++標(biāo)準(zhǔn)庫提供了一個(gè)名為std::exception的基類,它是所有標(biāo)準(zhǔn)異常類的基類。當(dāng)創(chuàng)建自定義異常類時(shí),通常繼承自std::exception,并重寫其what()成員函數(shù)以提供關(guān)于異常的詳細(xì)信息。
析構(gòu)函數(shù)是一種特殊的成員函數(shù),它在對象的生命周期結(jié)束時(shí)被自動調(diào)用。析構(gòu)函數(shù)在以下情況下被調(diào)用:
析構(gòu)函數(shù)的定義與普通成員函數(shù)類似,但需要在類聲明中指定其返回類型為void。析構(gòu)函數(shù)不能有參數(shù),也不能有返回值。在類定義中,析構(gòu)函數(shù)的名稱是在類名后加上波浪線(~)。
以下是一個(gè)簡單的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;
}
在這個(gè)示例中,我們定義了一個(gè)名為MyException的自定義異常類,繼承自std::exception。在divide函數(shù)中,我們檢查除數(shù)是否為零,如果是,則拋出MyException異常。在main函數(shù)中,我們使用try-catch塊捕獲并處理MyException異常。