C++ 速查手冊 V1.00 - 單元 6.1 - try throw catch 陳述




例外處理為控制程式發生錯誤後的機制, C++ 使用 trythrowcatch 三個關鍵字 (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 ...

沒有留言: