異常處理機制
本人節選自《21天學通c++》一書
c++並不是第乙個對結構化執行期錯誤處理進行支援的語言。早在20世紀60年代,pl/1就提供了一種內建的異常處理機制;ada也在20世紀80年代提供了自己的異常處理,而c++是在2023年時才有了異常處理機制。但是,c++的異常處理是獨一無二的,並且其已經作為了一種模型出現在一些新產生的語言之中。
事實上,c++中的異常處理機制是一種把控制權從異常發生的地點轉移到乙個匹配的處理函式或功能塊的機制。其中,異常可以是內建資料型別變數,也可以是物件。一般來說,異常處理機制包括4個部分。
try語句塊:即乙個定義異常的語句塊。
throw表示式:即丟擲異常語句。
異常本身。
一般來說,try語句塊包含可能丟擲異常的**。例如,下列語句可能引發記憶體空間溢位的異常,其就包含在try語句中。
try乙個try語句塊後面將跟有乙個或多個catch語句,其中,每乙個catch語句可以處理不同型別的異常。例如:
trycatch(std::bad_alloc& ) //記憶體空間不夠,分配記憶體失敗
catch (std::bad_cast&) //轉型失敗,分配記憶體失敗
trycatch(int n)
讀者需要注意的是,throw表示式和返回語句很相似。此外,throw語句可以沒有運算元,其格式如下所示:
throw;
注意:一般來說,如果目前沒有異常被處理,那麼執行乙個沒有運算元的throw語句後,編譯系統將會呼叫terminate()函式結束程式。
當乙個異常被丟擲後,c++執行機制首先在當前的作用域尋找合適的處理catch語句塊。如果不存在這樣乙個處理,那麼將會離開當前的作用域,進入更外圍的一層繼續尋找。這個過程不斷地進行下去直到合適的處理被找到為止。此時堆疊已經被解開,並且所有的區域性物件被銷毀。如果始終都沒有找到合適的處理,那麼程式將會終止。
【範例20-6】求一元二次方程的實根,要求加上異常處理,判斷b*b-4*a*c是否大於0,成立則求兩個實根,否則要求重新輸入,實現**如**清單20-6所示。
**清單20-6
1 #include
2 #include //包含標頭檔案
3 using namespace std; //使用命名空間
4 double sqrt_delta(double d) //定義函式
5 10 double delta(double a, double b, double c) //定義函式
11 15 void main()
16 31 catch(int) //定義異常處理
32 36 }
37 }
【執行結果】在visual c++中新建乙個【c++ source file】檔案,輸入上述的**,編譯無誤後執行。
【範例解析】上述範例實現了對於使用者輸入的一元二次方程係數的判斷,由於只有方程的係數符合b*b-4*a*c>0的條件時才有實根,所以上述**中的sqrt_delta ()函式中包含了異常定義。在上述**的第31~35行中的catch語句塊中包含了對該異常的處理。
二十一天學通C 之使用throw丟擲異常
使用throw丟擲異常 本人節選自 21天學通c 一書 丟擲異常 也稱為拋棄異常 即檢測是否產生異常,在c 中,其採用throw語句來實現,如果檢測到產生異常,則丟擲異常。該語句的格式為 throw 表示式 如果在try語句塊的程式段中 包括在其中呼叫的函式 發現了異常,且拋棄了該異常,則這個異常就...
二十一天學通C 之使用throw丟擲異常
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!使用throw丟擲異常 本人節選自 21天學通c 一書 丟擲異常 也稱為拋棄異常 即檢測是否產生異常,在c 中,其採用throw語句來實現,如果檢測到產生異常,則丟擲異常。該語句的格式為 throw 表示式 如果在try語句塊的程式段中 包括在其中...
二十一天學通C語言 函式型指標
二十一天學通c語言 函式型指標 本文節選自 21天學通c語言 一書 c程式中的函式也都是存放在 區內的,它們同樣也是有位址的。那麼如何取得函式的位址呢?在前面也說過函式定義的時候實際上是定義了乙個函式變數,那麼是否可以將函式變數賦值給其他變數呢?回答這些問題需要涉及另外乙個概念 函式型指標。按照已有...