#include
#include
using namespace std;
class Wrong {}; // 異常類型標識
int intDiv(int a, int b) {
try {
if (b == 0) throw 10; // 拋出 int
// if (b == 0) throw Wrong(); // 拋出類對象
return a / b;
} catch (int e) {
cout << "除法異常已處理: " << e << endl;
return -1;
}
}
int main() {
int x, y;
cin >> x >> y;
try {
if (y == 0) throw "被除數為0";
if (x == 0) throw "除數為0";
} catch (const char* msg) {
cout << msg << ",請重新輸入" << endl;
cin >> x >> y;
}
cout << intDiv(x, y) << endl;
return 0;
}
若構造函數拋出異常,對象未完全構造,析構函數不會被調用。需確保已分配資源在拋出前釋放,或使用智能指針/RAII。
class Array {
int *p, n;
public:
Array(int num) {
if (num <= 0) throw Wrong(); // 拋出前未分配記憶體,安全
n = num;
p = new int[num];
for (int i=0; i= n) throw WrongA();
return p[idx];
}
};
捕獲時按聲明順序匹配,子類異常應放在基類之前。示例中定義巢狀異常類 zero, wrong, big, small,捕獲時用 catch (Box::zero) 等精確匹配。
文檔另存為獨立文件,此處不再列出。