C 處理異常 基礎一

2021-06-12 06:08:07 字數 4578 閱讀 2456

c++處理異常的機制引入

在乙個小的程式中,可以用比較簡單的方法處理異常,例如用if語句判別除數是否為0,如果是。則輸出乙個出錯資訊。但是在乙個大的系統中,包含許多模組,每個模組義包含許多函式,函式之間又五相呼叫,比較複雜。如果在每乙個函式中都設定處理異常的程式段,會使程式過於複雜和龐大。因此,c++採取的辦法是:如果在執行乙個函式過程中出現異常,可以不在本函式中立即處理,而是發出乙個資訊,傳給它的上一級(即呼叫它的函式),它的上級捕捉到這個信啟後進行處理。如果上一級的函式也不能處理,就再傳給其上一級,由其上一級處理。如此逐級上送,如果到最高一級還無法處理,最後只好異常終止程式的執行。

這樣做使異常的發現與處理不由同一函式來完成。好處是使底層的函式專門用於解決實際任務,而不必再承擔處理異常的任務,以減輕底層函式的負擔,而把處理異常的任務上移到某一層去處理。例如在主函式中呼叫十幾個函式,只需在主函式中設定處理異常即可,而不必在每個函式中都設定處理異常,這樣可以提高效率。

c++處理異常的機制組成: 

c++處理異常的機制是由3個部分組成的,即檢查(try)、丟擲(throw)和捕捉(catch)。把需要檢查的語句放在try塊中,throw用來當出現異常時發出(形象地稱為丟擲,throw的意思是丟擲)乙個異常資訊,而catch則用來捕捉異常資訊,如果捕捉到廠異常資訊,就處理它:

例1 給出三角形的三邊a,b,c,求三角形的面積。只有a+b>c,b+c>a,c+a>b時才能構成三角形。設定異常處理,對不符合三角形條件的輸出警告資訊,不予計算。

#include

#include

using namespace std;

int main()

return 0; }

double ********(double a,double b,double c)

運**況如下

: 6 5 4/

(輸入a,b,c的值) 

9.92157 

(輸出三角形的面積) 

1 1.5 2/ 

(輸入a,b,c的值) 

0.726184 

(輸 1 2 1 / 

(輸人a,b,c的值) 

o  (輸出三角形的面積,此結果顯然不對,因為不是三角形) 

1 0 6/ ( 

輸入a,b,c的值) (結束)

程式沒有對三角形條件(任意兩邊之和應大於第三邊)進行檢查,因此,當輸入a=l,b=2,c=1時,則計算出三角形的面積為0,顯然是不合適的。

現在修改程式,在函式********中對三角形條件進行檢查,如果不符合三角形條件,就丟擲乙個異常資訊,在主函式中的try-catch塊中呼叫********函式,檢測有無異常資訊,並相應處理。修改後的程式如下:

#include

#include

using namespace std;

int main()

} catch(double) 

//用catch捕捉異常資訊並作相應處理 

double ********(double a,double b,double c) 

//計算三角形的面積的函式 

程式執行結果如下: 

6 5 4 

(輸入a,b,c的值)

9.92157 

(計算出三角形的面積)

1 1.5 2

(輸入a,b,c的值)

0.726184 

(計算出三角形的面積)

1 2 1 

(輸入a,b,c的值)

a=1,b=2,c=1,that is not a ********! 

(異常處理)

end

現在結合程式分析怎樣進行異常處理。

(1)首先把可能出現異常的、需要檢查的語句或程式段放在try後面的花括號中。由於riangle函式是可能出現異常的部分,所以把while迴圈連同********函式放在try塊中。這些語句是正常流程的一部分,雖然被放在by塊中,並不影響它們按照原來的順序執行。

(2)程式開始執行後,按正常的順序執行到try塊,開始執行by塊中花括號內的語句。如果在執行try塊內的語句過程中沒有發生異常,則catch子句不起作用,流程轉到catch子句後面的語句繼續執行。

(3)如果在執行try塊內的語句(包括其所呼叫的函式)過程中發生異常,則throw運算子丟擲乙個異常資訊。請看程式中的********函式部分,當不滿足三角形條件時,throw丟擲double型別的異常資訊a。throw丟擲異常資訊後,流程立即離開本函式,轉到其上一級的函式(main函式)。因此不會執行********函式中if語句之後的return語句。

throw丟擲什麼樣的資料由程式設計者自定,可以是任何型別的資料(包括自定義型別的據,如類物件)。

(4)這個異常資訊提供給try-catch結構,系統會尋找與之匹配的catch子句。現在a是double型,而catch子句的括號內指定的型別也是double型,二者匹配,即catch捕獲了該異常資訊,這時就執行catch子句中的語句,本程式輸出a=1.b=2,c=1,that is not a ********! 

(5)在進行異常處理後,程式並不會自動終止,繼續執行catch子句後面的語句。本程式輸出「end」。注意並不是從出現異常點繼續執行while迴圈。如果在try塊的花括號內有10個語句,在執行第3個語句時出現異常,則在處理完該異常後,其餘7個語句不再執行,而轉到catch子句後面的語句去繼續執行。

由於catch子句是用來處理異常資訊的,往往被稱為catch異常處理塊或catch異常處理器。

異常處理的語法:

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

throw 表示式;

try-catch的結構為:

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

說明: 

(1)被檢測的函式必須放在try塊中,否則不起作用。

(2)try塊和catch塊作為—個整體出現,catch塊是try-catch結構中的一部分,必須緊跟在try塊之後,不能單獨使用,在二者之間也不能插入其他語句,

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

(4)乙個try-catch結構中只能有乙個try塊,但卻可以有多個catch塊,以便與不同的異常資訊匹配。

(5)catch後面的圓括號中,一般只寫異常資訊的型別名,如

catch(double)

catch只檢查所捕獲異常資訊的型別: 異常資訊可以是c++系統預定義的標準型別,也可以是使用者自定義的型別(如結構體或類)。如果由throw丟擲的資訊屬於該型別或其子型別,則catch與throw二者匹配,catch捕獲該異常資訊。

catch還可以有另外一種寫法,即除了指定型別名外,還指定變數名,如:

catch(double d)

此時如果throw丟擲的異常資訊是double型的變數a,則catch在捕獲異常資訊a的同時,還使d獲得a的值,或者說d得到a的乙個拷貝。什麼時候需要這樣做呢?有時希望在捕獲異常資訊時,還能利用throw丟擲的值,如

(6)如果在catch子句中沒有指定異常資訊的型別,而用了刪節號「…」,則表示它可以捕捉任何型別的異常資訊, 

如: catch(…) 

//呼叫fl() 

catch

(double)

void f1()  

//呼叫f2() 

catch

( char )

cout<<"end1"//呼叫f3()

catch

(int)

//丟擲double型別異常資訊 

catch

(float)

~student() 

; void student::get_data() 

//定義成員函式 

void fun()

//過程函式

(注意可見性)

//呼叫smd2的get data函式 

int main()

//呼叫fun函式 

catch(int n)

分析程式執行過程,程式執行結果如下:

main begiin

call fun()

constructor-110l

//對立student類物件stud1,num=1101 

110l tan

//物件stud1呼叫student類的成員函式get_data

, num不等o 

in get_data()

//執行get_data 

constructor-0

//建立student類物件stud2,num=0,丟擲num. 

destructor-o

//呼叫student類物件stud1的析構函式 

destructor-1101

//呼叫student類物件stud2的析構函式 

num=o,error! 

//表示num=0出錯。

main end 

//表示主函式結束

本節簡單地介紹了異常處理的機制和使用方法,讀者將會在今後的實際應用中進一步掌握它們。

C 基礎 異常處理

程式執行時常會碰到一些異常情況,例如 這些異常情況,如果不能發現並加以處理,很可能會導致程式崩潰。所謂 處理 可以是給出錯誤提示資訊,然後讓程式沿一條不會出錯的路徑繼續執行 也可能是不得不結束程式,但在結束前做一些必要的工作,如將記憶體中的資料寫入檔案 關閉開啟的檔案 釋放動態分配的記憶體空間等。一...

C 異常處理 C 基礎

1 using system 2using system.collections.generic 3using system.linq 4using system.text 5using system.threading.tasks 67 namespace 異常處理815 catch 1617 c...

C 超基礎 異常處理

1.什麼是異常?異常就是在程式的執行過程中所發生的不正常的事件,它會中斷正在執行的程式。2.異常處理是通過4個關鍵字來實現的 try catch 捕獲 finally throw 丟擲 3.使用try catch捕獲異常,如果在try catch語句塊後加入finally塊,可以確保無論是否發生異常...