try 塊和異常處理 (c primer)

2021-06-21 16:20:05 字數 3692 閱讀 1298

異常機制提供程式中錯誤檢測與錯誤處理部分之間的通訊。c++ 的異常處理中包括:

throw 表示式

,錯誤檢測部分使用這種表示式來說明遇到了不可處理的錯誤。可以說,throw引發了異常條件。

try 塊

,錯誤處理部分使用它來處理異常。try 語句塊以 try 關鍵字開始,並以乙個或多個catch 子句

結束。在 try 塊中執行的**所丟擲(throw)的異常,通常會被其中乙個 catch 子句處理。由於它們「處理」異常,catch 子句也稱為處理**

由標準庫定義的一組異常類

,用來在 throw 和相應的 catch 之間傳遞有關的錯誤資訊。

回顧將兩個 sales_item 型別物件相加的程式,就是乙個簡單的例子。該程式檢查讀入的記錄是否來自同一本書。如果不是,就輸出一條資訊然後退出程式。

sales_item item1, item2;

std::cin >> item1 >> item2;

// first check that

item1

anditem2

represent the same book

if (item1.same_isbn(item2)) else

在使用 sales_items 的更簡單的程式中,把將物件相加的部分和負責跟使用者互動的部分分開。在這個例子中,用 throw 丟擲異常來改寫檢測**:

// first check that data is for the same item

if (!item1.same_isbn(item2))

throw runtime_error("data must refer to same isbn");

// ok, if we're still here the isbns are the same

std::cout << item1 + item2 << std::endl;

這段**檢查 isbn 物件是否不相同。如果不同的話,停止程式的執行,並將控制轉移給處理這種錯誤的處理**。

throw 語句使用了乙個表示式。在本例中,該表示式是 runtime_error 型別的物件。runtime_error 型別是標準庫異常類中的一種,在 stdexcept 標頭檔案中定義。在後續章節中很快就會更詳細地介紹這些型別。我們通過傳遞 string 物件來建立 runtime_error 物件,這樣就可以提供更多關於所出現問題的相關資訊。

try 塊的通用語法形式是:

try  catch (exception-specifier)  catch (exception-specifier)  //...

try 塊以關鍵字 try 開始,後面是用花括號起來的語句序列塊。try 塊後面是乙個或多個 catch 子句。每個 catch 子句包括三部分:關鍵字 catch,圓括號內單個型別或者單個物件的宣告——稱為

異常說明符,以及通常用花括號括起來的語句塊。如果選擇了乙個 catch 子句來處理異常,則執行相關的塊語句。一旦 catch 子句執行結束,程式流程立即繼續執行緊隨著最後乙個 catch 子句的語句。

try 語句內的 program-statements 形成程式的正常邏輯。這裡面可以包含任意 c++ 語句,包括變數宣告。與其他塊語句一樣,try 塊引入區域性作用域,在 try 塊中宣告的變數,包括 catch 子句宣告的變數,不能在 try 外面引用。

在前面的例子中,使用了 throw 來避免將兩個表示不同書的 sales_items 物件相加。想象一下將 sales_items 物件相加的那部分程式與負責與使用者交流的那部分是分開的,則與使用者互動的部分也許會包含下面的用於處理所捕獲異常的**:

while (cin >> item1 >> item2)  catch (runtime_error err) 

}

關鍵字 try 後面是乙個塊語句。這個塊語句呼叫處理 sales_item 物件的程式部分。這部分也可能會丟擲 runtime_error 型別的異常。

上述 try 塊提供單個 catch 子句,用來處理 runtime_error 型別的異常。在執行 try 塊**的過程中,如果在 try 塊中的**丟擲 runtime_error 型別的異常,則處理這類異常的動作在 catch 後面的塊語句中定義。本例中,catch 輸出資訊並且詢問使用者是否繼續進行異常處理。如果使用者輸入'n',則結束 while;否則繼續迴圈,讀入兩個新的 sales_items 物件。

通過輸出 err.what() 的返回值提示使用者。大家都知道 err 返回 runtime_error 型別的值,因此可以推斷出 what 是 runtime_error 類的乙個成員函式(1.5.2 節)。每乙個標準庫異常類都定義了名為 what 的成員函式。這個函式不需要引數,返回 c 風格字串。在出現 runtime_error 的情況下,what 返回的 c 風格字串,是用於初始化 runtime_error 的 string 物件的副本。如果在前面章節描述的**丟擲異常,那麼執行這個 catch 將輸出。

data must refer to same isbn

try again? enter y or n

在 標頭檔案中定義的標準異常類

exception

最常見的問題。

runtime_error

執行時錯誤:僅在執行時才能檢測到問題

range_error

執行時錯誤:生成的結果超出了有意義的值域範圍

overflow_error

執行時錯誤:計算上溢

underflow_error

執行時錯誤:計算下溢

logic_error

邏輯錯誤:可在執行前檢測到問題

domain_error

邏輯錯誤:引數的結果值不存在

invalid_argument

邏輯錯誤:不合適的引數

length_error

邏輯錯誤:試圖生成乙個超出該型別最大長度的物件

out_of_range

邏輯錯誤:使用乙個超出有效範圍的值

new標頭檔案定義了 bad_alloc 異常型別,提供因無法分配內在而由 new丟擲的異常。

type_info 標頭檔案定義了 bad_cast 異常型別。

標準庫異常類

標準庫異常類只提供很少的操作,包括建立、複製異常型別物件以及異常型別物件的賦值。 exception、bad_alloc 以及 bad_cast 型別只定義了預設建構函式,無法在建立這些型別的物件時為它們提供初值。其他的異常型別則只定義了乙個使用 string 初始化式的建構函式。當需要定義這些異常型別的物件時,必須提供一想 string 引數。string 初始化式用於為所發生的錯誤提供更多的資訊。

異常型別只定義了乙個名為 what 的操作。這個函式不需要任何引數,並且返回 const char* 型別值。它返回的指標指向乙個 c 風格字串。使用 c 風格字串的目的是為所丟擲的異常提出更詳細的文字描述。

what 函式所返回的指標指向 c 風格字元陣列的內容,這個陣列的內容依賴於異常物件的型別。對於接受 string 初始化式的異常型別,what 函式將返回該 string 作為 c 風格字元陣列。對於其他異常型別,返回的值則根據編譯器的變化而不同。

try塊和異常處理

try塊和異常處理 c 的異常處理中包括 1 throw表示式,錯誤檢測部分使用這種表示式來說明遇到了不可處理的錯誤。可以說,throw引發了異常條件。2 try塊,錯誤處理部分使用它來處理異常。try語句塊以try關鍵字開始,並以乙個或多個catch子句結束。在try塊中執行的 所丟擲的異常,通常...

try語句塊和異常處理

今晚看了一下c primer 的異常處理的簡單介紹,在這裡簡略記一下 異常處理機制包括異常檢測和異常處理 在c 中異常處理主要包括 throw表示式 用 throw 表示式來丟擲 引發 異常 那自然有接收 try語句塊 包含catch子句 用try語句塊來表示這段 可能會丟擲異常,丟擲的異常通常會被...

try語句塊和異常處理

在c 中,異常處理包括 throw表示式 throw expression 異常檢測部分使用throw表示式來表示它遇到了無法處理的問題。throw表示式丟擲乙個異常並把控制權轉移到能處理該異常的最近的catch子句。try語句塊 try block 異常處理部分使用try語句塊處理異常。try關鍵...