大家好,我是情報(bào)小哥~
1、什么是異常處理
有經(jīng)驗(yàn)的朋友應(yīng)該知道,在正常的C和C++編程過程中難免會(huì)碰到程序不按照原本設(shè)計(jì)運(yùn)行的情況。
最常見的有除法分母為零,數(shù)組越界,內(nèi)存分配失效、打開相應(yīng)文件失敗等等。
一個(gè)程序的健壯不僅僅有算法上的優(yōu)越性,還存在程序?qū)Ω鞣N異常情況的識(shí)別和處理能力,如果對(duì)這些異常沒有得到較好的處理,就非常容易引起程序的奔潰。
那么C++設(shè)計(jì)了一套異常處理機(jī)制,一方面能夠使得異常處理和正常運(yùn)行代碼進(jìn)行分離,使得程序更加模塊化;另一方面,C++的異常處理可以不需要異常處理在異常發(fā)生時(shí)的同一個(gè)函數(shù),而是可以在更上層合適的位置進(jìn)行處理。
下面一起看看C++的異常處理:
2、異常處理語法
C++異常處理涉及到3個(gè)關(guān)鍵字:
throw---拋出一個(gè)異常,帶參數(shù)
try---用于標(biāo)識(shí)可能會(huì)出現(xiàn)異常的代碼段
catch--是用于標(biāo)識(shí)異常處理的代碼段
下面小哥就一個(gè)例子來說明一下他們的使用方法:
#include
using namespace std;
int main(int argc, char** argv) {
try{
cout<<"Run Normal"<throw 2; //拋出異常
cout<<"No arrived"<catch(int a) //異常代碼處理塊
{
cout<<"Error : "<return 0;
}
try所標(biāo)識(shí)的為程序正常運(yùn)行的代碼段,所以首先打印"Run Normal"字符串,由于遇到了throw拋出此處程序存在異常,程序便會(huì)跳出try所標(biāo)識(shí)的代碼段,然后尋找catch所標(biāo)識(shí)的異常處理代碼段,這便會(huì)匹配到了正下方的catch輸出"Error : 2”字樣。
3、try-catch注意事項(xiàng)
上面的例子挺簡(jiǎn)單的,不過異常處理機(jī)制還有很多值得注意的使用方法:
1、當(dāng)throw拋出異常以后,會(huì)以函數(shù)調(diào)用的方式一層一層的尋找相應(yīng)的catch,如果當(dāng)前函數(shù)層沒有找到會(huì)立馬返回到上層函數(shù)進(jìn)行查找,如果一直沒有找到程序就會(huì)停止運(yùn)行。
下面寫了一個(gè)demo驗(yàn)證一下:
#include
using namespace std;
void FunctionDown(void)
{
cout<<"Run Normal"<throw 2; //拋出異常
cout<<"No arrived"<void FunctionMid(void)
{
FunctionDown();
}
void FunctionUp(void)
{
try
{
FunctionMid();
}
catch(int a) //異常代碼處理塊
{
cout<<"Error : "<int main(int argc, char** argv) {
FunctionUp();
return 0;
}
該程序最后運(yùn)行的結(jié)果與前面的是一致的,這樣函數(shù)內(nèi)部的異常都可以拋出來最后統(tǒng)一處理。
2、同一個(gè)try可以帶多個(gè)catch用于不同異常的處理。且不同的catch依次匹配異常參數(shù),匹配后便會(huì)執(zhí)行,否則會(huì)繼續(xù)往上層進(jìn)行catch匹配。
老規(guī)矩,寫個(gè)代碼驗(yàn)證一下:
#include
using namespace std;
void FunctionDown(void)
{
cout<<"Run Normal"<//throw "bug"; //拋出異常
throw (float)3.14; //拋出異常
cout<<"No arrived"<void FunctionMid(void)
{
FunctionDown();
}
void FunctionUp(void)
{
try
{
FunctionMid();
}
catch(int a) //異常代碼處理塊
{
cout<<"Error : "<int main(int argc, char** argv) {
try
{
FunctionUp();
}
catch(float a) //異常代碼處理塊
{
cout<<"Error : "<catch(char const *str) //異常代碼處理塊
{
cout<<"Error : "<return 0;
}
最終由于FunctionMid內(nèi)的catch的參數(shù)無法匹配上,則繼續(xù)往上層進(jìn)行catch匹配,直到匹配到main函數(shù)中的catch(float a)才成功。
最 后
好了,這里小哥就簡(jiǎn)單介紹了C++異常處理try-catch,本系列文章后續(xù)還會(huì)更新,記得關(guān)注學(xué)習(xí)哦。
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4327瀏覽量
62569 -
C++
+關(guān)注
關(guān)注
22文章
2108瀏覽量
73618 -
代碼
+關(guān)注
關(guān)注
30文章
4779瀏覽量
68521
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論