C 的異常處理

2021-06-16 19:23:50 字數 1790 閱讀 5427

程式中常見的錯誤有兩種:語法錯誤和執行時錯誤

語法錯誤一般在編譯的時候會給出提示,但是執行時錯誤則不是那麼容易發現的。有的甚至能正常執行,但是不能給出正確的結果,或者程式非正常終止,或者導致宕機。

因此,所有導致出現這些非正常情況的都屬於異常。在程式中我們要自己給出相應的異常處理機制,來避免出現自己未預料到的結果。

c++給出的異常處理機制由三部分組成:檢查(try)、丟擲(throw)、捕捉(catch)。

把需要檢查的語句放在try塊中,throw用來在出現異常的時候發出乙個異常資訊,catch用來捕捉這個資訊,如果捕捉到了,就處理它。

語法:throw 語句一般是由throw運算子和乙個資料組成的,形式為     throw   表示式

try-catch結構為  

try要檢查的語句塊;

catch (異常資訊型別 [變數名])

處理異常的語句;

說明:(1)被檢查語句必須放在try語句塊中,否則不起作用

(2)try和catch必須放在一起,中間不能隔其他的語句。也可以只有try,沒有catch,表示只檢查異常,並不做處理。

(3)try和catch的語句塊必須用花括號括起來,即使只有乙個語句也不能省略。

(4)乙個try-catch結構中,可以只有乙個try,但可以有很多catch塊,來匹配不同的異常型別。

(5)catch後面的小括號中,一般只寫異常資訊的型別名,如catch(double)。catch只檢查異常資訊的型別,而不檢查他們的值。

因此,如果要捕捉不同的異常型別,應當由throw丟擲不同的異常型別。另外,catch後面的小括號裡也可以指定變數名,這樣

在throw丟擲異常時若指定了變數,可以由catch指定的變數來獲取異常變數的拷貝。以便於後面對該異常資訊的需要。

(6)若catch後面的小括號中沒有型別名,只有...。即catch(...),表示可以捕捉到任何型別的異常。這種catch子句應該放在try-catch結構的

最後,表示捕捉到異常的其他情況。否則,其他的catch將不起作用。

(7)try-catch結構可以出現在同乙個函式中,也可以不出現在同乙個函式中。在異常出現的時候,系統會自動先在本函式中尋找匹配的catch,

如果找不到匹配的,則會去距離該try最近的catch尋找匹配,直到找到匹配的catch結構。

(8)在有些情況下,throw可以不包括任何表示式,表示我不處理這個異常,交給上級函式去處理。

(9)如果throw丟擲的異常找不到匹配的catch子句去處理,則系統會呼叫乙個系統函式terminate,使程式終止執行。

例子#include

using namespace std;

intmain( )

//呼叫f1( )

catch(double)

// 呼叫f3( )

catch(int)

{cout<<″ok2!″《程式執行結果如下: 

ok0!(在主函式中捕獲異常)

end0 (執行主函式中最後乙個語句時的輸出)

如果將f3函式中的catch子句改為

catch(double),而程式中其他部分不變,則程式運

行結果如下:

ok3!(在f3函式中捕獲異常)

end3 (執行f3函式中最後乙個語句時的輸出)

end2 (執行f2函式中最後乙個語句時的輸出)

end1 (執行f1函式中最後乙個語句時的輸出)

end0 (執行主函式中最後乙個語句時的輸出)

如果在此基礎上再將f3函式中的catch塊改為

catch(double)

{cout<<″ok3!″<

的異常處理 C 異常處理總結

做開發不僅僅要考慮到業務邏輯更要在寫 時將各種可能考慮周全,但是這又是很難的事情,畢竟開發就是個人的事,而使用者可能上萬甚至百萬級別。這時,程式的穩定性就極為重要,我們不能讓程式因為某一處執行出問題而就直接導致程式或者產生其他更嚴重的後果,比如 做除法時當除數為零時,陣列訪問越界時,容器capaci...

異常處理(二 C語言的異常處理)

1 異常終止 標準c庫提供了abort 和exit 兩個函式,它們可以強行終止程式的執行,其宣告處於 標頭檔案中。這兩個函式本身不能檢測異常,但在c程式發生異常後經常使用這兩個函式進行程式終止。下面的這個例子描述了exit 的行為 code include include int main void...

C 的異常處理

c 的異常處理用到 try catch try塊是乙個普通的程式塊,就一般運 況而言跟沒有tryd的情況是一樣的,但在異常出現時,往往把可能出現異常的一些語句,包括函式的呼叫,比如在資料庫程式設計程式設計中,一些管理資訊系統在連線資料庫的時候 特別是ado方式 往往會把資料庫的連線與表的開啟語句放在...