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