throw expression; // expression 可為任意型別:int、指標、物件、字串...
異常物件在拋出點建立,透過呼叫堆疊向上傳播,直到遇到匹配的 catch。
class OutOfRange {
int flag, len, idx;
public:
OutOfRange() : flag(1) {} // 空陣列
OutOfRange(int l, int i) : flag(2), len(l), idx(i) {} // 越界
void what() const {
if (flag==1) cout << "Error: empty array";
else cout << "Error: out of range (len " << len << ", idx " << idx << ")";
}
};
class Array {
int *p, len, cap, step=50;
public:
Array() { p=(int*)malloc(step*sizeof(int)); cap=step; len=0; }
~Array() { free(p); }
int& operator[](int i) {
if (i<0 || i>=len) throw OutOfRange(len, i);
return p[i];
}
int push(int e) { /* 擴容邏輯 */ p[len++]=e; return len-1; }
int pop() { if (len==0) throw OutOfRange(); return p[--len]; }
int length() const { return len; }
};
// 使用
Array a;
for (int i=0; i<10; ++i) a.push(i);
try { cout << a[20]; } catch (OutOfRange& e) { e.what(); }
try { for (int i=0; i<20; ++i) a.pop(); } catch (OutOfRange& e) { e.what(); }