例外處理為控制程式發生錯誤後的機制, C++ 使用 try 、 throw 與 catch 三個關鍵字 (keyword) 進行例外處理。
try 後面的大括弧用來放可能會發生錯誤的程式碼,在會發生錯誤的地方用 throw 丟出例外 (exception) , catch 依據例外的型態 (type) 進行處理。舉例如下
001 | #include <iostream> |
002 | |
003 | int main() { |
004 | int i = -1; |
005 | |
006 | try { |
007 | if (i < 0) { |
008 | throw "something wrong..."; |
009 | } |
010 | } |
011 | catch (const char* message) { |
012 | std::cout << message |
013 | << std::endl; |
014 | } |
015 | |
016 | return 0; |
017 | } |
018 | |
019 | /* Kaiching Chang |
020 | u0601_1.cpp |
021 | 2014-02 */ |
假設 i 小於 0 會發生錯誤,因此檢查 i 是否小於 0 ,如果小於 0 就用 throw 丟出 "something wrong..." 的例外
006 | try { |
007 | if (i < 0) { |
008 | throw "something wrong..."; |
009 | } |
010 | } |
對應到 catch 的部份,例外型態就是 const 的字元指標 (pointer)
011 | catch (const char* message) { |
012 | std::cout << message |
013 | << std::endl; |
014 | } |
意思就是抓到字串 (string) 的例外型態,因為 throw 後面就是丟出字串。
編譯執行,結果如下
$ g++ u0601_1.cpp |
$ ./a.out |
something wrong... |
$ |
例外的型態可以是標準程式庫 (standard library) 中的型態,或是自訂的型態,例如
001 | #include <iostream> |
002 | |
003 | struct BadValue : |
004 | public std::exception {}; |
005 | |
006 | double divide(double a, double b) { |
007 | if (b == 0) { |
008 | throw BadValue(); |
009 | } |
010 | |
011 | return a / b; |
012 | } |
013 | |
014 | int main() { |
015 | try { |
016 | std::cout << divide(20, 5) |
017 | << std::endl; |
018 | std::cout << divide(20, 4) |
019 | << std::endl; |
020 | std::cout << divide(20, 3) |
021 | << std::endl; |
022 | std::cout << divide(20, 2) |
023 | << std::endl; |
024 | std::cout << divide(20, 1) |
025 | << std::endl; |
026 | std::cout << divide(20, 0) |
027 | << std::endl; |
028 | } |
029 | catch (BadValue e) { |
030 | std::cout << "something wrong..." |
031 | << std::endl; |
032 | } |
033 | |
034 | return 0; |
035 | } |
036 | |
037 | /* Kaiching Chang |
038 | u0601_2.cpp |
039 | 2014-02 */ |
這裡的 BadValue 繼承自標準程式庫中的 exception
003 | struct BadValue : |
004 | public std::exception {}; |
由於除法在分母為 0 時無法計算,因此在 divide() 函數 (function) 中遇到分母為 0 時就 throw 出一個例外
006 | double divide(double a, double b) { |
007 | if (b == 0) { |
008 | throw BadValue(); |
009 | } |
010 | |
011 | return a / b; |
012 | } |
try 部份的程式碼會逐一執行,碰到發生例外就會跳到 catch 的部份,編譯執行結果如下
$ g++ u0601_2.cpp |
$ ./a.out |
4 |
5 |
6.66667 |
10 |
20 |
something wrong... |
$ |
continue ...
沒有留言:
張貼留言