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()寫一起,只要有一個捕捉到,其他的所有都會失效,所以 比較廣泛比較通用的放後面,比較特例狹窄範圍的放前面。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料