C 異常型別以及多級catch

2021-09-27 05:24:45 字數 1853 閱讀 7031

首先來回顧一下上節講到的 try-catch 的用法:

trycatch(exceptiontype variable)
我們還遺留下乙個問題,就是 catch 關鍵字後邊的exceptiontype variable,這節就來詳細分析一下。

exceptiontype是異常型別,它指明了當前的 catch 可以處理什麼型別的異常;variable是乙個變數,用來接收異常資訊。當程式丟擲異常時,會建立乙份資料,這份資料報含了錯誤資訊,程式設計師可以根據這些資訊來判斷到底出了什麼問題,接下來怎麼處理。

異常既然是乙份資料,那麼就應該有資料型別。c++ 規定,異常型別可以是 int、char、float、bool 等基本型別,也可以是指標、陣列、字串、結構體、類等聚合型別。c++ 語言本身以及標準庫中的函式丟擲的異常,都是 exception 類或其子類的異常。也就是說,丟擲異常時,會建立乙個 exception 類或其子類的物件。

exceptiontype variable和函式的形參非常類似,當異常發生後,會將異常資料傳遞給 variable 這個變數,這和函式傳參的過程類似。當然,只有跟 exceptiontype 型別匹配的異常資料才會被傳遞給 variable,否則 catch 不會接收這份異常資料,也不會執行 catch 塊中的語句。換句話說,catch 不會處理當前的異常。

我們可以將 catch 看做乙個沒有返回值的函式,當異常發生後 catch 會被呼叫,並且會接收實參(異常資料)。

·但是 catch 和真正的函式呼叫又有區別:

·真正的函式呼叫,形參和實參的型別必須要匹配,或者可以自動轉換,否則在編譯階段就報錯了。

而對於 catch,異常是在執行階段產生的,它可以是任何型別,沒法提前**,所以不能在編譯階段判斷型別是否正確,只能等到程式執行後,真的丟擲異常了,再將異常型別和 catch 能處理的型別進行匹配,匹配成功的話就「呼叫」當前的 catch,否則就忽略當前的 catch。

總起來說,catch 和真正的函式呼叫相比,多了乙個「在執行階段將實參和形參匹配」的過程。

另外需要注意的是,如果不希望 catch 處理異常資料,也可以將 variable 省略掉,也即寫作:

trycatch(exceptiontype)

這樣只會將異常型別和 catch 所能處理的型別進行匹配,不會傳遞異常資料了。

多級 catch

前面的例子中,乙個 try 對應乙個 catch,這只是最簡單的形式。其實,乙個 try 後面可以跟多個 catch:

trycatch(exception_type_1 e)catch(exception_type_2 e)

//其他的catch

catch(exception_type_n e)

當異常發生時,程式會按照從上到下的順序,將異常型別和 catch 所能接收的型別逐個匹配。一旦找到型別匹配的 catch 就停止檢索,並將異常交給當前的 catch 處理(其他的 catch 不會被執行)。如果最終也沒有找到匹配的 catch,就只能交給系統處理,終止程式的執行。

下面的例子演示了多級 catch 的使用:

#include#includeusingnamespacestd;

class base{};

class derived:publicbase{};

intmain();

try{

thrownums;

cout<<"this statement will not be executed."《執行結果:

exception type: const int *

nums 本來的型別是int [3],但是 catch 中沒有嚴格匹配的型別,所以先轉換為int ,再轉換為const int 。

C 異常處理 多重catch塊

有時候只使用乙個異常處理不完全解決程式 現的異常,需要多個異常處理,這就需要多重catch來實現。一段 可能會生成多個異常當引發異常時,會按順序來檢視每個 catch 語句,並執行第乙個型別與異常型別匹配的語句執行其中的一條 catch 語句之後,其他的 catch 語句將被忽略。多重catch語法...

異常的型別catch中不同的Exception

filereader的物件 filenotfoundexception 錯誤傳遞給構造方法乙個null,構造方法將丟擲乙個nullpointexception空指標異 構造方法初始化了乙個檔案輸出流,如果這個檔案不開啟,這個構造方法將丟擲乙個ioexception arraylist類的get方法,...

C 異常處理入門 try和catch

目錄 開發程式是一項 燒腦 的工作,程式設計師不但要經過長期的知識學習和思維訓練,還要做到一絲不苟,注意每乙個細節和邊界。即使這樣,也不能防止程式出錯。專家指出,長期作息不規律 用腦過度的危害很大,可能會誘發神經衰弱 失眠等疾病。我就是受害者之一,曾被失眠困擾了好幾年,不但入睡困難,還容易早醒。程式...