C++整理19_異常處理

hwaityd發表於2024-10-20

異常處理

異常處理是一種程式結構,它允許程式在發生錯誤時繼續執行,而不是立即終止。它由三個主要部分組成:try塊、throw語句和catch塊。

1. 檢測try

概念try塊是包圍可能丟擲異常的程式碼的語句塊。
原理:編譯器會生成額外的程式碼來檢測try塊中丟擲的異常,並將其傳遞給匹配的catch塊。
用法:使用try關鍵字來定義可能丟擲異常的程式碼塊。

2. 丟擲throw

概念throw語句用於在發生錯誤時丟擲一個異常。
原理throw語句會導致立即退出當前的try塊,並開始搜尋匹配的catch塊。
用法:使用throw後跟異常物件來丟擲異常。

3. 捕獲catch

概念catch塊用於捕獲並處理異常。
原理:當異常被丟擲時,程式會搜尋匹配的catch塊來處理這個異常。
用法:使用catch關鍵字後跟異常型別的引數來捕獲異常。

4. C++標準異常:exception類

概念:C++標準庫定義了一系列預定義的異常類,這些類都繼承自exception類。
原理:這些異常類為常見的錯誤情況提供了標準的方式來丟擲和捕獲異常。
用法:可以直接使用這些異常類,也可以建立自定義異常類繼承自它們。

5. 自定義異常類:

概念:自定義異常類允許開發者定義自己的異常型別,以提供更具體的異常資訊。
原理:自定義異常類通常繼承自exception類,並可以新增額外的資料成員和方法。
用法:定義一個繼承自exception的類,並在丟擲異常時使用這個類的例項。

完整案例程式碼

#include <iostream>
#include <exception>

using namespace std;

// 自定義異常類
class MyException : public exception {
private:
    string message;
public:
    MyException(const string& msg) : message(msg) {}
    
    // 覆蓋 what() 方法以提供異常資訊
    virtual const char* what() const throw() {
        return message.c_str();
    }
};

// 函式可能會丟擲異常
void mightGoWrong(int value) {
    if (value < 0) {
        throw MyException("Negative value is not allowed");
    }
    cout << "Value is " << value << endl;
}

int main() {
    try {
        mightGoWrong(-1); // 這將丟擲異常
    } catch (const MyException& e) {
        cout << "Caught an exception: " << e.what() << endl;
    } catch (const exception& e) {
        cout << "Caught a standard exception: " << e.what() << endl;
    }
    
    try {
        mightGoWrong(5); // 這將不會丟擲異常
    } catch (const MyException& e) {
        cout << "Caught an exception: " << e.what() << endl;
    }
    
    return 0;
}

在這個案例中,我們定義了一個MyException類,它繼承自exception類,並覆蓋了what()方法以提供異常資訊。mightGoWrong函式在接收到負數值時會丟擲MyException。在main函式中,我們使用try-catch塊來捕獲並處理這些異常。如果mightGoWrong函式丟擲了MyException,第一個catch塊將捕獲它並列印異常資訊。如果丟擲了其他型別的標準異常,第二個catch塊將捕獲並處理它。