異常就是程式執行時出現的不正常,例如執行時耗盡了記憶體或遇到意外的非法輸入. 異常存在於程式的正常功能之外,並要求程式立即處理. 異常機制提供程式中錯誤檢測與錯誤處理部分之間的通訊. c++的異常處理中包括:
throw表示式 : 錯誤檢測部分使用這種表示式來說明遇到了不可處理的錯誤.可以說,throw引發了異常條件.
try塊: 錯誤處理部分使用它來處理異常. try語句塊以try關鍵字開始,並以乙個或多個catch字句結束. 在try塊中執行的**所丟擲的異常,通常會被其中乙個catch字句處理.由於它們"處理"異常,catch字句也稱處理**.
由標準庫定義的一組異常類,用來在throw和相應的catch之間傳遞有關的錯誤資訊.
throw表示式
系統通過throw表示式丟擲異常.throw表示式由關鍵字throw以及尾隨的表示式組成, 通常以分號結束, 這樣它就成為了表示式語句. throw表示式的型別決定了所丟擲異常的型別.
以乙個計算兩個數的調和平均數的函式為例
double hmean ( double a, double b )
return 2.0*a*b/(a+b);
}
上面的**中,如果a == -b;則立刻輸出錯誤提示, 並結束程式. 該**可以用throw丟擲異常來改寫,如下
double hmean ( double a, double b )
throw語句使用了乙個表示式,該表示式是runtime_error型別的物件.rumtime_error型別是標準庫異常類中的一種,在stdexcept標頭檔案中定義. 可以測試一下這個程式.
#include #include using namespace std;
int main()
}
return 0;
}
what是rumtime_error 類的乙個成員函式, 每乙個標準庫異常類都定義了名為what的成員函式,這個函式不需要引數,返回c風格字串.在出現runtime_error的情況下,what返回的c風格字串,是用於初始化runtime_error的string物件的副本.
try塊
try塊的通用語法形式是:
try catch ( exception-specifier) catch ( exception-specifier) //...
try塊以關鍵字try開始,後面是用花括號括起來的語句序列塊.try塊後面是乙個或多個catch子句. 每個catch子句包括三部分 : 關鍵字catch,圓括號內單個型別或者單個物件的宣告------稱為異常說明符,以及通常用花括號括起來的語句塊.如果選擇了乙個catch子句來處理異常,則執行相關的塊語句.一旦catch子句執行結束,程式流程立即執行緊隨著最後乙個catch子句的語句.
try語句內program-statement形成程式的正常邏輯.這裡面可以包含任意c++語句,包括變數宣告.與其他塊語句一樣,try塊引入區域性作用域,在try塊中宣告的變數,包括catch子句中宣告的變數,不能在try外面引用.
函式在尋找處理**的過程中退出
如果不存在處理該異常的catch子句,程式的執行就要跳轉到名為terminate的標準庫函式,該函式在excepttion標頭檔案中定義.這個標準庫函式的行為依賴於系統,通常情況下,他的執行將導致程式非正常退出.
標準異常
c++標準庫定義了一組類,用於報告在標準庫中函式遇到的問題. 標準庫異常定義在四個標頭檔案中:
(1) exception標頭檔案定義了最常見的異常類,它的類名是exception.這個類只通知異常的產生,但不會提供更多的資訊.
(2)stdexcept標頭檔案定義了幾種常見的異常類
(3)new標頭檔案定義了bad_alloc異常型別,提供因無法分配記憶體而由new丟擲的異常.
(4)type_info標頭檔案定義了bad_cast異常型別.
在標頭檔案中定義的標準異常類
exception 最常見的問題
runtime_error 執行時錯誤: 僅在執行時才能檢測到的問題
range_error 執行時錯誤: 生成的結果超出了有意義的值域範圍
overflow_error 執行時錯誤: 計算上溢
underflow_error 執行時錯誤: 計算下溢
logic_error 邏輯錯誤: 可以在執行前檢測到的問題
domain_error 邏輯錯誤: 引數的結果值不存在
invalid_argument 邏輯錯誤: 不合適的引數
length_error 邏輯錯誤: 試圖生成乙個超出該型別最大長度的物件
out_of_range 邏輯錯誤: 使用乙個超出有效範圍的值
標準庫異常類
標準庫異常類只提供很少的操作, 包括建立,複製異常型別物件以及異常型別物件的賦值. exception, bad_alloc以及bad_cast型別只定義了預設建構函式, 無法在建立這些型別物件時為它們提供初值. 其他的異常型別則只定義了乙個使用string初始化式的建構函式,當需要定義這些異常型別的物件時,必須提供乙個string引數. string初始化式用於為所發生的錯誤提供更多的資訊.
異常型別只定義了乙個名為what的操作.這個函式不需要任何引數,並且返回const char* 型別的值. 它返回的指標指向乙個c風格字串.使用c風格字串的目的是為所丟擲的異常提供更詳細的文字描述.
assert預處理巨集
assert巨集是在cassert標頭檔案中定義的,所有使用assert的檔案都必須包含這個標頭檔案.
預處理巨集有點像函式呼叫. assert巨集需要乙個表示式作為它的條件:
assert(expr)
如果expr的結果為false,assert輸出資訊並且終止程式的執行.如果該表示式有乙個非0值,則assert不做任何操作.一般使用assert來測試"不可能發生"的條件.
C Primer 筆記 異常處理
1.棧展開過程沿著巢狀函式的呼叫鏈不斷查詢,直到找到了與異常匹配的catch句子為止,或者也可能一直沒找到匹配的catch,則程式將呼叫terminate,退出主函式後查詢過程終止。假設找到了乙個catch,則執行其中的 執行完之後,找到與try塊關聯的最後乙個catch子句之後的點,並從這裡繼續執...
《C Primer》筆記之異常處理
一 丟擲異常 當程式發生異常的時候可以用throw語句丟擲異常物件,丟擲的異常物件由throw以後的實際物件所決定。假設有這樣乙個異常類繼承層次結構 基類是excep並從他派生出乙個mathexc異常物件,當宣告了乙個excep指標pe,則語句throw pe將丟擲乙個excep異常物件,無論pe實...
try 塊和異常處理 (c primer)
異常機制提供程式中錯誤檢測與錯誤處理部分之間的通訊。c 的異常處理中包括 throw 表示式 錯誤檢測部分使用這種表示式來說明遇到了不可處理的錯誤。可以說,throw引發了異常條件。try 塊 錯誤處理部分使用它來處理異常。try 語句塊以 try 關鍵字開始,並以乙個或多個catch 子句 結束。...