1. 程式人生 > >C++筆記(8):C++異常處理

C++筆記(8):C++異常處理

交互 under nbsp divide 析構函數 nat 花括號 ++ fff

                    異常處理

  C++異常處理機制是一個用來有效地處理運行錯誤的非常強大且靈活的工具,它提供了更多的彈性、安全性和穩固性,克服了傳統方法所帶來的問題.
異常的拋出和處理主要使用了以下三個關鍵字: try、 throw 、 catch 。
try語句
  try代碼塊由關鍵字try以及後面的一對大括號組成,大括號中定義的代碼塊,就是可能出現異常的代碼。try代碼塊中包含了可能引起異常的語句以及發生異常時應該跳過的語句。(也就是可能引起異常的函數以及沒有異常發生時應該執行的語句)。異常可能是由try代碼塊中的代碼直接導致的,也可能是由於調用其它函數導致的,還有可能是由於try代碼塊中的代碼所發起的深層嵌套函數調用所導致的。
catch語句
  異常是由catch處理器處理的,他會捕獲並處理異常。在每個try代碼塊之後,必須至少緊挨著一個catch處理器。每個catch處理器都以關鍵字catch開始,並在一對圓括號中指定一個異常參數(exception parameter),表示它能夠處理的異常的類型(DivideByZeroException)。當try代碼塊發生異常時,就會執行異常參數的類型與這個異常匹配的那個catch處理器(即catch代碼塊的類型與被拋出的異常類型準確對應,或者是他的基類)。如果異常參數包含可選的參數名,則catch處理器可以使用這個參數名與catch處理器代碼體重被捕獲的異常交互。
throw語句
  throw語句用來主動拋出異常。如果在try語句塊的程序段中(包括在其中調用的函數)發現了異常,且拋出了該異常,則這個異常就可以被try語句塊後的某個catch語句所捕獲並處理,捕獲和處理的條件是被拋棄的異常的類型與catch語句的異常類型相匹配。由於C++使用數據類型來區分不同的異常,因此在判斷異常時,throw語句中的表達式的值就沒有實際意義,而表達式的類型就特別重要。

異常處理的一般格式為:
  try


  {
    //被檢查語句
    throw 異常;
  }
  catch(異常類型1)
  {
    //進行異常處理的語句1
  }
  catch(異常類型2)
  {
    //進行異常處理的語句2
  }
catch(...)//捕獲所有的異常
{
}
在異常匹配的時候,只對類型進行匹配,不關心拋出的異常對象的值。

異常的類型
(1)可以拋出基本數據類型異常,如int和char等
(2)可以拋出復雜數據類型異常,如結構體(在C++中結構體也是類)和類;
(3)C++的異常處理必須由調用者主動檢查。一旦拋出異常,而程序不捕獲的話就會導致程序異常終止。

註意事項
(1)try和catch塊中必須要用花括號括起來,即使花括號內只有一個語句也不能省略花括號;
(2)try和catch必須成對出現,一個try_catch結果中只能有一個try塊,但可以有多個catch塊,以便與不同的異常信息匹配;
(3)如果在catch塊中沒有指定異常信息的類型,而用刪節號"...",則表示它可以捕獲任何類型的異常信息

(4)C++中一旦拋出一個異常,如果程序沒有任何的捕獲,那麽系統將會自動調用一個系統函數terminate,由它調用abort終止程序
(5)構造函數內可以拋出異常,析構函數內不要拋出異常。

標準異常對象的類型
在C++標準庫中,有些函數拋出特定的異常,而另外一些根本不拋任何異常。
因為C++標準中沒有明確規定,所以C++的庫函數可以拋出任何對象或不拋。

但C++標準推薦運行庫的實現通過拋出定義在<stdexecpt>中的異常類型或其派生類型來報告錯誤:
class logic_error;
class domain_error;
class invalid_argument;
class length_error;
class out_of_range;
class runtime_error;
class range_error;
class overflow_error;
class underflow_error;

C++筆記(8):C++異常處理