throw 表示式;
該語句拋出一個異常。異常是一個表示式,其值的型別可以是基本型別,也可以是類。
try {
語句組
}
catch(異常型別) {
例外處理程式碼
}
...
catch(異常型別) {
例外處理程式碼
}
{}
中的內容稱作“try塊”,把 catch 和其後{}
中的內容稱作“catch塊”。#include <iostream> using namespace std; int main() { double m ,n; cin >> m >> n; try { cout << "before dividing." << endl; if( n == 0) throw -1; //丟擲int型別異常 else cout << m / n << endl; cout << "after dividing." << endl; } catch(double d) { cout << "catch(double) " << d << endl; } catch(int e) { cout << "catch(int) " << e << endl; } cout << "finished" << endl; return 0; }程式的執行結果如下:
catch(int e)
塊執行,該 catch 塊執行完畢後,程式繼續往後執行,直到正常結束。catch(int e)
,改為catch(char e)
,當輸入的 n 為 0 時,拋出的整型異常就沒有 catch 塊能捕獲,這個異常也就得不到處理,那麼程式就會立即中止,try...catch 後面的內容都不會被執行。
catch(...) {
...
}
#include <iostream> using namespace std; int main() { double m, n; cin >> m >> n; try { cout << "before dividing." << endl; if (n == 0) throw - 1; //丟擲整型異常 else if (m == 0) throw - 1.0; //拋出 double 型異常 else cout << m / n << endl; cout << "after dividing." << endl; } catch (double d) { cout << "catch (double)" << d << endl; } catch (...) { cout << "catch (...)" << endl; } cout << "finished" << endl; return 0; }程式的執行結果如下:
catchy(...)
捕獲。catch (double)
和catch(...)
都能匹配該異常,但是catch(double)
是第一個能匹配的 catch 塊,因此會執行它,而不會執行catch(...)
塊。catch(...)
能匹配任何型別的異常,它後面的 catch 塊實際上就不起作用,因此不要將它寫在其他 catch 塊前面。
#include <iostream> #include <string> using namespace std; class CException { public: string msg; CException(string s) : msg(s) {} }; double Devide(double x, double y) { if (y == 0) throw CException("devided by zero"); cout << "in Devide" << endl; return x / y; } int CountTax(int salary) { try { if (salary < 0) throw - 1; cout << "counting tax" << endl; } catch (int) { cout << "salary < 0" << endl; } cout << "tax counted" << endl; return salary * 0.15; } int main() { double f = 1.2; try { CountTax(-1); f = Devide(3, 0); cout << "end of try block" << endl; } catch (CException e) { cout << e.msg << endl; } cout << "f = " << f << endl; cout << "finished" << endl; return 0; }程式的輸出結果如下:
f = Devide(3, 0);
。#include <iostream> #include <string> using namespace std; int CountTax(int salary) { try { if( salary < 0 ) throw string("zero salary"); cout << "counting tax" << endl; } catch (string s ) { cout << "CountTax error : " << s << endl; throw; //繼續丟擲捕獲的異常 } cout << "tax counted" << endl; return salary * 0.15; } int main() { double f = 1.2; try { CountTax(-1); cout << "end of try block" << endl; } catch(string s) { cout << s << endl; } cout << "finished" << endl; return 0; }程式的輸出結果如下:
throw;
沒有指明拋出什麼樣的異常,因此拋出的就是 catch 塊捕獲到的異常,即 string("zero salary")。這個異常會被 main 函數中的 catch 塊捕獲。
void func() throw (int, double, A, B, C);
或void func() throw (int, double, A, B, C){...}
上面的寫法表明 func 可能拋出 int 型、double 型以及 A、B、C 三種型別的異常。異常宣告列表可以在函數宣告時寫,也可以在函數定義時寫。如果兩處都寫,則兩處應一致。void func() throw ();
則說明 func 函數不會拋出任何異常。