C 演算法學習 預備知識(4) 異常處理(1)

2021-08-01 19:23:27 字數 2897 閱讀 5161

異常提供了一種通過將控制轉移到名為處理程式的特殊功能來對我們程式中異常情況(如執行時錯誤)做出反應的方法。

要捕獲異常,我們必須將一部分**放在異常檢查下。 這是通過將該部分**包含在try塊中來完成的。 當該塊中出現異常情況時,丟擲異常,將異常處理程式傳遞給控制項。如果沒有丟擲異常,**將繼續正常執行,所有處理程式都將被忽略。

使用try塊內的throw關鍵字丟擲異常。異常處理程式用關鍵字catch宣告,它必須在try塊之後立即放置。異常處理下的**包含在try塊中。

下面我們分別解釋一下這三個keyword:

throw 語句在**塊中的可以在任何地方丟擲異常。throw 語句的運算元可以是任意的表示式,表示式的結果的型別決定了丟擲的異常的型別。比如我們都知道的常識,被除數不能為0,如果使用者輸入的話我們可以直接丟擲異常,我們很自然可以想到在 if 語句後面加 throw。

double division(int a, int b)

return (a / b);

}

但是這樣的執行我們肯定有疑問,因為throw不是cout,這裡的函式返回型別是double不是我們的字串,所以我們的直接throw是不會有反應的,編譯器會編譯出錯。我們可以寫個**試試:

#include 

using

namespace

std;

double division(int a, int b);

int main()

double division(int a, int b)

return (a / b);

}

執行結果是這樣的:

那麼是不是我們用法有問題?當然不是!等會我們就來解決這個問題!

常規的使用格式如下:

try

catch( exceptionname e )

exceptionname 指的是異常的型別,可以為int型 也可以為 double,char等等,例如下面的乙個簡單的例子:

#include 

using

namespace

std;

int main ()

catch (int e) //exceptionname 的型別是int,注意我們這個時候並沒有用throw而是cout

return

0;}

執行結果:

異常處理程式用catch關鍵字宣告。你可以看到,它立即跟隨try塊的關閉括號。 捕獲格式類似於始終至少有乙個引數的常規函式。此引數的型別非常重要,因為通過throw表示式傳遞的引數的型別與之匹配,只有在匹配的情況下,才會捕獲異常。(這就是為什麼我們前面會報錯

我們可以鏈結多個處理程式(catch表示式),每個處理程式具有不同的引數型別。 只有匹配其型別的處理程式才能執行在throw語句中指定的引數。

如果我們使用省略號(…)作為catch的引數,該處理程式將捕獲任何異常,無論丟擲異常的型別是什麼。這可以用作乙個預設處理程式,它捕獲最後指定的其他處理程式未捕獲的所有異常:

try 

catch (int param)

catch (char param)

catch (...)

在這種情況下,最後乙個處理程式將捕獲任何不是int和char的引數丟擲的異常。在處理異常之後,程式執行會在try-catch塊之後恢復,而不是在throw語句之後!也可以將try-catch塊巢狀在更多的外部try塊中。 在這種情況下,我們有可能內部catch塊將異常**到外部級別。這是用表示式throw來完成的,沒有throw的內容。例如:

try 

catch (int n)

}catch (...)

現在我們來解決上面的throw問題:

#include 

using

namespace

std;

int main()catch(const

char* msg)

} return

0;}

當我們的輸入的數字中,被除數不為0的時候,程式就不會執行try-catch語句,而是正常執行,當觸發時,catch語句就捕獲這類的錯誤,丟擲我們的內容:

下面我們來看一段測試**:

/*

*這段**是我為了深入體會 try - catch語句所寫

*展示的原理是,我們catch的內容是指的我們丟擲的內容型別

*這裡我們輸入乙個char值,然後我們判斷各種型別,丟擲不同的異常

*最後實現多個catch的不同反應

*/#include

#include

using

namespace

std;

int main()catch(int e)catch(char e)catch(...)

} return

0;}

執行結果如下:

資料結構和演算法學習 1 預備知識

學好資料結構和演算法,是我的追求,這並不容易。基礎不牢,c語言學不好,資料結構你就推不動,陣列,指標之類的東西都不會,怎麼學?今天從頭開始,一點兒一點兒弄懂。文章裡面的 都是天勤資料結構裡面的,我按照這本書複習,加上自己的理解,寫清楚思路。1.結構體。結構體相當於乙個集合,裡面一般存放一些型別不同的...

演算法學習 4

排序是演算法學習中最基礎的內容,也有很多中排序演算法,這裡簡單介紹學一下堆排序。理解堆排序之前,一定要先明白什麼是堆,其實它就是乙個陣列或者是陣列的一部分,一定要記住明白這一點,不然容易有一種樹結構的錯覺。它就是在陣列的元素間定義一些關係,讓這些元素看起來近似乙個二叉樹。這些元素組成的陣列就叫做堆。...

C 語法學習異常處理 Exception

using system class test catch exception e finally console.writeline finally later try catch exception e finally console.writeline finally later try 這裡...