嵌入(ru)式學習筆記:C++ 異(yi)常(chang)及(ji)處理詳解(jie),都是重點(dian)
時間:2018-09-05 來源:未知(zhi)
C高級是(shi)學習C的(de)進(jin)階階段,而且對(dui)于(yu)c高級來說,c++異常(chang)也是(shi)必須要學習的(de),而且對(dui)于(yu)c++異常(chang)來說有很多(duo)種,是(shi)需要自己(ji)好(hao)(hao)好(hao)(hao)研究的(de),在(zai)這里對(dui)c++異常(chang)做了詳細的(de)了解,希望(wang)對(dui)你(ni)也是(shi)有用的(de)。
C++ 異常處(chu)理
異常(chang)是(shi)程(cheng)序在(zai)執(zhi)行(xing)期間產生的問題。C++ 異常(chang)是(shi)指在(zai)程(cheng)序運行(xing)時發生的特殊(shu)情(qing)況,比如嘗試除以零(ling)的操作。
異常(chang)提(ti)供(gong)了(le)一種轉(zhuan)移程序控制權的方式。C++ 異常(chang)處(chu)理(li)涉及到三個關鍵字:try、catch、throw。
throw: 當(dang)問題出(chu)現(xian)時(shi),程序(xu)會拋出(chu)一個異常。這是通(tong)過使用 throw 關(guan)鍵(jian)字來(lai)完成的。
catch: 在您想(xiang)要處(chu)理問題的地方,通(tong)過異常(chang)處(chu)理程序捕獲(huo)異常(chang)。catch 關鍵字用(yong)于捕獲(huo)異常(chang)。
try: try 塊中的(de)代碼標識將被激活的(de)特定(ding)異常(chang)。它后面(mian)通(tong)常(chang)跟著一個(ge)或(huo)多個(ge) catch 塊。
如果有(you)一(yi)個(ge)塊(kuai)拋出一(yi)個(ge)異常(chang),捕獲異常(chang)的方法(fa)會(hui)使
用 try 和 catch 關鍵(jian)字(zi)。try 塊(kuai)中放置可能拋出(chu)異常的(de)代碼(ma),try 塊(kuai)中的(de)代碼(ma)被稱為保護代碼(ma)。使用 try/catch 語(yu)句的(de)語(yu)法如下所(suo)示:
try
{
/ 保(bao)護代碼
}catch( ExceptionName e1 )
{
// catch 塊
}catch( ExceptionName e2 )
{
// catch 塊
}catch( ExceptionName eN )
{
// catch 塊
}
如果 try 塊在不同的情境下會拋出不同的異(yi)常,這個時候可以(yi)嘗試羅列多個 catch 語(yu)句,用于捕獲不同類型的異(yi)常。
拋出異常
您可以(yi)使用 throw 語句(ju)在代碼塊中(zhong)的任(ren)何地方(fang)拋出異常(chang)。throw 語句(ju)的操(cao)作數可以(yi)是任(ren)意的表(biao)達(da)式,表(biao)達(da)式的結果(guo)的類型決定了拋出的異常(chang)的類型。
以下是嘗試(shi)除以零時拋出異常(chang)的實例:
double division(int a, int b)
{
if( b == 0 )
{
throw "Division by zero condition!";
}
return (a/b);
}
捕獲異常
catch 塊跟在 try 塊后面,用于捕獲異(yi)常(chang)。您可以指(zhi)定(ding)想要(yao)捕捉的(de)異(yi)常(chang)類型,這是由 catch 關(guan)鍵字后的(de)括號內的(de)異(yi)常(chang)聲明(ming)決(jue)定(ding)的(de)。
try
{
/ 保護(hu)代碼(ma)
}catch( ExceptionName e )
{
// 處理 ExceptionName 異常的代碼
}
上面的(de)代碼會捕獲一個(ge)類型(xing)為 ExceptionName 的(de)異常。如果您想
讓 catch 塊能夠處理 try 塊拋(pao)出的任何類型的異(yi)(yi)常(chang),則必須在異(yi)(yi)常(chang)聲(sheng)明的括號內使用省略號 ...,如下所示:
try
{
/ 保護代碼(ma)
}catch(...)
{
/ 能處理任何異常的(de)代碼
}
C++ 標準的異常
C++ 提供(gong)了一(yi)系列(lie)標準的異常(chang)(chang),定義在 中,我們可以在程序中使(shi)用這些(xie)標準的異常(chang)(chang)。它們是(shi)以父子類(lei)層次(ci)結構組織起來(lai)的,如(ru)下所示:

C++ 異(yi)常的(de)層次結構
下表是對上面層次結構(gou)中出現的每個(ge)異常的說(shuo)明:


定義新的異常
您可以通過繼承(cheng)和重載 exception 類來(lai)定(ding)義新的異(yi)常。下面的實例(li)演示了(le)如何使用(yong) std::exception 類來(lai)實現自己(ji)的異(yi)常:
實例
#include
#include
using namespace std;
struct MyException : public exception
{
const char * what () const throw ()
{
return "C++ Exception";
}
};
int main()
{
try
{
throw MyException();
}
catch(MyException& e)
{
std::cout << "MyException caught" << std::endl;
std::cout << e.what() << std::endl;
}
catch(std::exception& e)
{
//其他的錯誤
}
}

