異常處理
異常處理是一種程式結構,它允許程式在發生錯誤時繼續執行,而不是立即終止。它由三個主要部分組成: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
塊將捕獲並處理它。