C/C++ 學習筆記 005 – 異常處理(例外處理)
異常處理 的學習筆記
例如 資源不足、開檔失敗、越線超過下標範圍、輸入錯誤、除零的時候,需要有特定的回傳訊息。
基本名詞
try block、throw statement、catch block
try{} : try block,包含要測試的片段
throw statement: try{} 裡面預期可能丟出問題的片段的前或後可以加上 throw敘述,通常寫在各個函式內,而不會寫在main,比方:
某函式() throw(char *) { 片段1 ... if(某種錯誤條件) { throw "錯誤報告"; } 片段2 ... }
註‧加上 throw(char *) 表示就算拿掉 try 跟 catch ,編譯器也不會特地把 throw 挑成錯
catch {} : catch block ,接收錯誤訊息並輸出,大概長這樣:
catch(char * pErr) { cerr << "異常訊息:" << pErr << endl; } // 這是丟出字串的範例 // 注意 catch 接收的資料型態要跟 throw 丟出的資料型態吻合 // 如果不想漏接,可以寫 catch(...) 三個句點,代表所有可能
丟其他資料型態
不只可以丟一般數值資料,還可以丟 enum 或是丟 class 定義的物件。
1. enum
例如定好:
enum ErStat= {OK, NO, YES, RIGHT}
總共列舉四種狀況,那 throw 之前就可以根據狀況更新訊息內容 ,最後throw 符合的那一筆資料出去。
範例函式() { ErStat state; if(狀況一) state = OK; else if(狀況二) state = NO; ...吧啦吧啦 .... throw state; }
然後 catch 的地方:
catch (ErStat Error) { cerr或其他處理 }
2. 丟 class
在 .h 的 namespace 裡可以定好要反應的訊息物件
例如、
namespace ExErr { class Over {}; class Unknown {}; class Zero {}; }
在 main() 裡頭大概是這樣
main() { ... 程式片段一 ... try { 某函式(); } catch(Over){ Over相關處理} catch(Unknown){ Unknown相關處理} catch(Zero){ Zero相關處理} catch(...){ 預期之外錯誤的相關處理} ... 程式片段二 ... return 0; }
在某函式()裡頭大概是這樣
某函式(){ ... 程式片段三 ... if(Over的狀況) { throw Over(); } if(Unknown的狀況) { throw Unknown(); } if(Zero的狀況) { throw Zero(); } ... 程式片段四 ... }
捕捉
catch 結束的時候,會不停的展開函式的 call stack,一口氣結束到找出吻合的資料型態的 catch block 為止。
多個catch()寫一起,只要有一個捕捉到,其他的所有都會失效,所以 比較廣泛比較通用的放後面,比較特例狹窄範圍的放前面。
Leave a Reply