發(fā)布于:2021-01-28 11:37:51
0
288
0
什么是C ++中的異常處理?
C ++中的異常處理為您提供了一種處理意外情況(如運(yùn)行時(shí)錯(cuò)誤)的方法。因此,每當(dāng)發(fā)生意外情況時(shí),程序控制就會(huì)轉(zhuǎn)移到稱為處理程序的特殊功能。
要捕獲異常,請(qǐng)將代碼的某些部分置于異常檢查之下。代碼段位于try-catch塊中。
如果在該代碼段中發(fā)生異常情況,將引發(fā)異常。接下來(lái),異常處理程序?qū)⒔庸艹绦虻目刂啤?/span>
如果沒有異常情況,代碼將正常執(zhí)行。處理程序?qū)⒈缓雎浴?/span>
為什么要進(jìn)行異常處理?
這是在C ++中使用異常處理的原因:
您將把錯(cuò)誤處理代碼與常規(guī)代碼分開。該代碼將更具可讀性,并且易于維護(hù)。
函數(shù)可以處理他們選擇的異常。即使一個(gè)函數(shù)拋出許多異常,它也只會(huì)處理一些異常。調(diào)用方將處理未捕獲的異常。
異常處理關(guān)鍵字
C ++中的異常處理涉及以下三個(gè)關(guān)鍵字:
throw-當(dāng)程序遇到問(wèn)題時(shí),它將引發(fā)異常。throw關(guān)鍵字可幫助程序執(zhí)行throw。
catch-程序使用異常處理程序來(lái)捕獲異常。它被添加到需要處理該問(wèn)題的程序部分。使用catch關(guān)鍵字即可完成。
try -try塊標(biāo)識(shí)將為其激活某些異常的代碼塊。它后面應(yīng)該是一個(gè)/多個(gè)捕獲塊。
假設(shè)代碼塊將引發(fā)異常。異常將被使用try和catch關(guān)鍵字的方法捕獲。try / catch塊應(yīng)包含可能引發(fā)異常的代碼。此類代碼稱為受保護(hù)代碼。
句法:
try / catch采用以下語(yǔ)法:
try { // the protected code } catch( Exception_Name exception1 ) { // catch block } catch( Exception_Name exception2 ) { // catch block } catch( Exception_Name exceptionN ) { // catch block }
盡管我們有一個(gè)try語(yǔ)句,但是我們可以有很多catch語(yǔ)句。
ExceptionName是要捕獲的異常的名稱。
exception1,exception2和exceptionN是您定義的用于引用異常的名稱。
范例1:
#include<iostream> #include<vector> using namespace std; int main() { vector<int> vec; vec.push_back(0); vec.push_back(1); // access the third element, which doesn't exist try { vec.at(2); } catch (exception& ex) { cout << "Exception occurred!" << endl; } return 0; }
輸出:
這是代碼的屏幕截圖:
代碼說(shuō)明:
在程序中包含iostream頭文件以使用其功能。
將矢量頭文件包含在程序中以使用其功能。
在程序中將std名稱空間包括在其類中,而不調(diào)用它。
調(diào)用main()函數(shù)。程序邏輯應(yīng)添加在其主體內(nèi)。
創(chuàng)建一個(gè)名為vec的向量來(lái)存儲(chǔ)整數(shù)數(shù)據(jù)。
將元素0添加到名為vec的向量中。
將元素1添加到名為vec的向量中。
一條評(píng)論。C ++編譯器將跳過(guò)它。
使用try語(yǔ)句捕獲異常。{標(biāo)記為try / catch塊主體的開始。正文中添加的代碼將成為受保護(hù)的代碼。
嘗試訪問(wèn)存儲(chǔ)在名為vec的向量的索引2(第三個(gè)元素)處的元素。該元素不存在。
try / catch塊的主體末端。
捕獲異常。返回的錯(cuò)誤消息將存儲(chǔ)在變量ex中。
如果捕獲到異常,請(qǐng)?jiān)诳刂婆_(tái)上打印一些消息。
捕獲塊的主體末端。
程序應(yīng)在成功執(zhí)行后返回一個(gè)值。
main()函數(shù)主體的結(jié)尾。
范例2:
#include <iostream> using namespace std; double zeroDivision(int x, int y) { if (y == 0) { throw "Division by Zero!"; } return (x / y); } int main() { int a = 11; int b = 0; double c = 0; try { c = zeroDivision(a, b); cout << c << endl; } catch (const char* message) { cerr << message << endl; } return 0; }
輸出:
這是代碼的屏幕截圖:
代碼說(shuō)明:
在程序中包含iostream頭文件以使用其功能。
在程序中將std名稱空間包括在其類中,而不調(diào)用它。
創(chuàng)建一個(gè)名為zeroDivision的函數(shù),該函數(shù)接受兩個(gè)整數(shù)參數(shù)x和y。該函數(shù)應(yīng)返回一個(gè)雙精度結(jié)果。
使用if語(yǔ)句檢查變量參數(shù)y的值是否為0。{標(biāo)記if正文的開頭。
如果y為0,則返回/拋出該消息。
if語(yǔ)句的主體結(jié)尾。
zeroDivision函數(shù)應(yīng)返回x / y的值。
zeroDivision函數(shù)的主體結(jié)尾。
調(diào)用main()方法。{表示此方法的開始。
聲明一個(gè)整數(shù)變量并將其賦值為11。
聲明一個(gè)整數(shù)變量b并將其賦值為0。
聲明一個(gè)雙精度變量c并將其賦值為0。
使用try語(yǔ)句捕獲異常。{標(biāo)記為try / catch塊主體的開始。正文中添加的代碼將成為受保護(hù)的代碼。
調(diào)用zeroDivision函數(shù)并傳遞給參數(shù)a和b,即11和0。此操作的結(jié)果將存儲(chǔ)在變量c中。
在控制臺(tái)上打印出變量c的值。
try / catch塊的主體末端。
捕獲異常。返回的錯(cuò)誤消息將存儲(chǔ)在變量消息中。
在控制臺(tái)上打印出返回的錯(cuò)誤消息。
捕獲塊的主體末端。
程序應(yīng)在成功執(zhí)行后返回一個(gè)值。
main()函數(shù)主體的結(jié)尾。
C ++標(biāo)準(zhǔn)異常
C ++帶有在<exception>類中定義的標(biāo)準(zhǔn)異常列表。如下所述:
用戶定義的異常
C ++ std :: exception類允許我們定義可以作為異常拋出的對(duì)象。此類已在<exception>標(biāo)頭中定義。該類為我們提供了一個(gè)名為what的虛擬成員函數(shù)。
該函數(shù)返回char *類型的以空字符結(jié)尾的字符序列。我們可以在派生類中覆蓋它以獲取異常描述。
例:
#include <iostream> #include <exception> using namespace std; class newException : public exception { virtual const char* what() const throw() { return "newException occurred"; } } newex; int main() { try { throw newex; } catch (exception& ex) { cout << ex.what() << 'n'; } return 0; }
輸出:
這是代碼的屏幕截圖:
代碼說(shuō)明:
在我們的程序中包含iostream頭文件。我們將使用其功能而不會(huì)出錯(cuò)。
在我們的程序中包括異常頭文件。我們將使用其功能,例如沒有錯(cuò)誤的功能。
在我們的程序中包含std名稱空間,以使用其類而不調(diào)用它。
創(chuàng)建一個(gè)名為newException的新類。此類繼承C ++的異常類。
類主體的開始。
覆蓋在異常頭文件中定義的虛擬成員函數(shù)what()。然后,我們將描述我們自己的異常,即新異常。
啟動(dòng)新異常的定義。
如果捕獲到新的異常,則返回的消息。
新異常的定義結(jié)束。
類newException的主體的結(jié)尾。newex是用于捕獲新異常的名稱,此后將調(diào)用newException。
調(diào)用main()函數(shù)。程序邏輯應(yīng)添加在其主體內(nèi)。{表示其主體的開始。
使用try語(yǔ)句標(biāo)記需要標(biāo)記異常的代碼。{標(biāo)記為try / catch塊主體的開始。與此相關(guān)的代碼將受到保護(hù)。
如果發(fā)現(xiàn)newex異常,則將其引發(fā)。
嘗試結(jié)束。
使用catch語(yǔ)句捕獲異常。異常錯(cuò)誤消息將存儲(chǔ)在變量ex中。
在控制臺(tái)上打印異常錯(cuò)誤消息。
catch語(yǔ)句的主體結(jié)尾。
如果程序成功執(zhí)行,則應(yīng)返回一個(gè)值。
main()函數(shù)主體的結(jié)尾。
概要:
使用C ++中的異常處理,您可以處理運(yùn)行時(shí)錯(cuò)誤。
運(yùn)行時(shí)錯(cuò)誤是程序執(zhí)行期間發(fā)生的錯(cuò)誤。
異常處理可幫助您處理程序中的任何意外情況。
當(dāng)發(fā)生意外情況時(shí),程序控制將轉(zhuǎn)移到處理程序。
要捕獲異常,可以在try-catch塊下放置一段代碼。
throw關(guān)鍵字可幫助程序拋出異常,從而幫助程序處理問(wèn)題。
try關(guān)鍵字有助于標(biāo)識(shí)將為其激活某些異常的代碼塊。
我們可以覆蓋異常頭文件的what()函數(shù)來(lái)定義我們的異常。
作者介紹
熱門博客推薦