C++之異常處置詳解。本站提示廣大學習愛好者:(C++之異常處置詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C++之異常處置詳解正文
法式中的毛病分為編譯時的毛病和運轉時的毛病。編譯時的毛病重要是語法毛病,好比:句尾沒有加分號,括號不婚配,症結字毛病等,這類毛病比擬輕易修正,由於編譯體系會指失足誤在第幾行,甚麼毛病。而運轉時的毛病則不輕易修正,由於個中的毛病是弗成預感的,或許可以預感但沒法防止的,好比內存空間不敷,或許在挪用函數時,湧現數組越界等毛病。假如關於這些毛病沒有采用有用的防備辦法,那末常常會得不到准確的運轉成果,法式不正常終止或嚴重的會湧現逝世機景象。我們把法式運轉時的毛病統稱為異常,對異常處置稱為異常處置。C++中所供給的異常處置機制構造清楚,在必定水平上可以包管法式的硬朗性。
C++中處置異常的進程是如許的:在履行法式產生異常,可以不在本函數中處置,而是拋出一個毛病信息,把它傳遞給上一級的函數來處理,上一級處理不了,再傳給其上一級,由其上一級處置。如斯逐級上傳,直到最高一級還沒法處置的話,運轉體系會主動挪用體系函數terminate,由它挪用abort終止法式。如許的異常處置辦法使得異常激發和處置機制分別,而不在統一個函數中處置。這使得底層函數只須要處理現實的義務,而不用過量斟酌對異常的處置,而把異常處置的義務交給上一層函數行止理。
C++的異常處置機制有3部門構成:try(檢討),throw(拋出),catch(捕捉)。把須要檢討的語句放在try模塊中,檢討語句產生毛病,throw拋出異常,收回毛病信息,由catch來捕捉異常信息,並加以處置。普通throw拋出的異常要和catch所捕捉的異常類型所婚配。異常處置的普通格局為:
try
{
被檢討語句
throw 異常
}
catch(異常類型1)
{
停止異常處置的語句1
}
catch(異常類型2)
{
停止異常處置的語句2
}
...
上面我們用示例演示一下異常處置:
#include "stdafx.h"
#include <iostream>
template <typename T>
T Div(T x,T y)
{
if(y==0)
throw y;//拋出異常
return x/y;
}
int main()
{
int x=5,y=0;
double x1=5.5,y1=0.0;
try
{
//被檢討的語句
std::cout<<x<<"/"<<y<<"="<<Div(x,y)<<std::endl;
std::cout<<x1<<"/"<<y1<<"="<<Div(x1,y1)<<std::endl;
}
catch(int)//異常類型
{
std::cout<<"除數為0,盤算毛病!"<<std::endl;//異常處置語句
}
catch(double)//異常類型
{
std::cout<<"除數為0.0,盤算毛病!"<<std::endl;//異常處置語句
}
return0;
}
成果:
看了上述的示例代碼,或許有人會問,第二個雙精度類型的除法盤算也應當拋出異常才對啊,在現實的運轉進程中並不是如斯,其實該雙精度類型除法函數基本沒有被履行過。以上法式的履行規程為:挪用函數Div(x,y)時產生異常,由函數Div中的語句"throw y"拋出異常,其實不在往下履行return x/y,接著catch捕捉int類型的異常並處置異常,最初直接履行"return 0"。是以函數Div(x1,y1)和catch(double){}模塊基本沒有被履行。假如,我們把y的值改成1,則成果就釀成為:
假如在履行try語句模塊時,沒有產生異常,則catch語句塊不起感化,流程轉到厥後的語句持續履行。從上述兩個成果中可知第一次throw拋出的int類型所以找隨處理該類型的catch,而第二次是拋出double類型所找到的是處置double類型的catch。
上面對異常處置彌補幾點:(1)try和catch塊中必需要用花括號括起來,即便花括號內只要一個語句也不克不及省略花括號;(2)try和catch必需成對湧現,一個try_catch成果中只能有一個try塊,但可以有多個catch塊,以便與分歧的異常信息婚配;(3)假如在catch塊中沒有指定異常信息的類型,而用刪省號"...",則表現它可以捕捉任何類型的異常信息;(4)假如throw不包含任何表達式,表現它把以後正在處置的異常信息再次拋出,傳給其上一層的catch來處置;(5)C++中一旦拋出一個異常,假如法式沒有任何的捕捉,那末體系將會主動挪用一個體系函數terminate,由它挪用abort終止法式;
最初照樣一樣,我將用一個示例來總結一下明天所講的內容(開辟對象:vs2010):
#include "stdafx.h"
#include <iostream>
template <typename T>
T Div(T x,T y)
{
if(y==0)
throw y;//拋出異常
return x/y;
}
int main()
{
int x=5,y=1;
double x1=5.5,y1=0.0;
try
{
//被檢討的語句
std::cout<<x<<"/"<<y<<"="<<Div(x,y)<<std::endl;
std::cout<<x1<<"/"<<y1<<"="<<Div(x1,y1)<<std::endl;
}
catch(...)//捕捉隨意率性類型異常
{
try
{
std::cout<<"隨意率性類型異常!"<<std::endl;
throw;//拋出以後處置異常信息給上一層catch
}
catch(int)//異常類型
{
std::cout<<"除數為0,盤算毛病!"<<std::endl;//異常處置語句
}
catch(double)//異常類型
{
std::cout<<"除數為0.0,盤算毛病!"<<std::endl;//異常處置語句
}
}
return0;
}
成果: