C++异常处理try throw catch
生活随笔
收集整理的這篇文章主要介紹了
C++异常处理try throw catch
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
// tt.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
//
/*
程序中的錯(cuò)誤分為編譯時(shí)的錯(cuò)誤和運(yùn)行時(shí)的錯(cuò)誤。編譯時(shí)的錯(cuò)誤主要是語法錯(cuò)誤,比如:句尾沒有加分號,括號不匹配,關(guān)鍵字錯(cuò)誤等,這類錯(cuò)誤比較容易修改,因?yàn)榫幾g系統(tǒng)會(huì)指出錯(cuò)誤在第幾行,什么錯(cuò)誤。而運(yùn)行時(shí)的錯(cuò)誤則不容易修改,因?yàn)槠渲械腻e(cuò)誤是不可預(yù)料的,或者可以預(yù)料但無法避免的,比如內(nèi)存空間不夠,或者在調(diào)用函數(shù)時(shí),出現(xiàn)數(shù)組越界等錯(cuò)誤。如果對于這些錯(cuò)誤沒有采取有效的防范措施,那么往往會(huì)得不到正確的運(yùn)行結(jié)果,程序不正常終止或嚴(yán)重的會(huì)出現(xiàn)死機(jī)現(xiàn)象。我們把程序運(yùn)行時(shí)的錯(cuò)誤統(tǒng)稱為異常,對異常處理稱為異常處理。C++中所提供的異常處理機(jī)制結(jié)構(gòu)清晰,在一定程度上可以保證程序的健壯性。
C++中處理異常的過程是這樣的:在執(zhí)行程序發(fā)生異常,可以不在本函數(shù)中處理,而是拋出一個(gè)錯(cuò)誤信息,把它傳遞給上一級的函數(shù)來解決,上一級解決不了,再傳給其上一級,由其上一級處理。如此逐級上傳,直到最高一級還無法處理的話,運(yùn)行系統(tǒng)會(huì)自動(dòng)調(diào)用系統(tǒng)函數(shù)terminate,由它調(diào)用abort終止程序。這樣的異常處理方法使得異常引發(fā)和處理機(jī)制分離,而不在同一個(gè)函數(shù)中處理。這使得底層函數(shù)只需要解決實(shí)際的任務(wù),而不必過多考慮對異常的處理,而把異常處理的任務(wù)交給上一層函數(shù)去處理。
{
被檢查語句
throw 異常
}
catch(異常類型1)
{
進(jìn)行異常處理的語句1
}
catch(異常類型2)
{
進(jìn)行異常處理的語句2
}
下面對異常處理補(bǔ)充幾點(diǎn):
(1)try和catch塊中必須要用花括號括起來,即使花括號內(nèi)只有一個(gè)語句也不能省略花括號;
(2)try和catch必須成對出現(xiàn),一個(gè)try_catch結(jié)果中只能有一個(gè)try塊,但可以有多個(gè)catch塊,以便與不同的異常信息匹配;
(3)如果在catch塊中沒有指定異常信息的類型,而用刪節(jié)號"...",則表示它可以捕獲任何類型的異常信息;
(4)如果throw不包括任何表達(dá)式,表示它把當(dāng)前正在處理的異常信息再次拋出,傳給其上一層的catch來處理;
int _tmain(int argc, _TCHAR* argv[])
{
?? ?int Erro=100;
?? ?char szErro[100]="我是異常";
?? ?try
?? ?{
?? ??? ?//只呢個(gè)捕獲一次
?? ??? ?//throw(Erro);
?? ??? ?throw(szErro);
?? ?}
?? ?catch(int i)
?? ?{
?? ??? ?printf("出現(xiàn)異常:Erro==%d\n",i);
?? ?}
?? ?catch(char * pErro)
?? ?{
?? ??? ?printf("%s\n",pErro);
?? ?}
?? ?catch(...)
?? ?{
?? ??? ?printf("捕獲任何類型的異常\n");
?? ?}
?? ?return 0;
}
//
/*
程序中的錯(cuò)誤分為編譯時(shí)的錯(cuò)誤和運(yùn)行時(shí)的錯(cuò)誤。編譯時(shí)的錯(cuò)誤主要是語法錯(cuò)誤,比如:句尾沒有加分號,括號不匹配,關(guān)鍵字錯(cuò)誤等,這類錯(cuò)誤比較容易修改,因?yàn)榫幾g系統(tǒng)會(huì)指出錯(cuò)誤在第幾行,什么錯(cuò)誤。而運(yùn)行時(shí)的錯(cuò)誤則不容易修改,因?yàn)槠渲械腻e(cuò)誤是不可預(yù)料的,或者可以預(yù)料但無法避免的,比如內(nèi)存空間不夠,或者在調(diào)用函數(shù)時(shí),出現(xiàn)數(shù)組越界等錯(cuò)誤。如果對于這些錯(cuò)誤沒有采取有效的防范措施,那么往往會(huì)得不到正確的運(yùn)行結(jié)果,程序不正常終止或嚴(yán)重的會(huì)出現(xiàn)死機(jī)現(xiàn)象。我們把程序運(yùn)行時(shí)的錯(cuò)誤統(tǒng)稱為異常,對異常處理稱為異常處理。C++中所提供的異常處理機(jī)制結(jié)構(gòu)清晰,在一定程度上可以保證程序的健壯性。
C++中處理異常的過程是這樣的:在執(zhí)行程序發(fā)生異常,可以不在本函數(shù)中處理,而是拋出一個(gè)錯(cuò)誤信息,把它傳遞給上一級的函數(shù)來解決,上一級解決不了,再傳給其上一級,由其上一級處理。如此逐級上傳,直到最高一級還無法處理的話,運(yùn)行系統(tǒng)會(huì)自動(dòng)調(diào)用系統(tǒng)函數(shù)terminate,由它調(diào)用abort終止程序。這樣的異常處理方法使得異常引發(fā)和處理機(jī)制分離,而不在同一個(gè)函數(shù)中處理。這使得底層函數(shù)只需要解決實(shí)際的任務(wù),而不必過多考慮對異常的處理,而把異常處理的任務(wù)交給上一層函數(shù)去處理。
C++的異常處理機(jī)制有3部分組成:try(檢查),throw(拋出),catch(捕獲)。把需要檢查的語句放在try模塊中,檢查語句發(fā)生錯(cuò)誤,throw拋出異常,發(fā)出錯(cuò)誤信息,由catch來捕獲異常信息,并加以處理。一般throw拋出的異常要和catch所捕獲的異常類型所匹配。MFC定義了TRY、CATCH(及AND_CATCH、END_CATCH)和THROW(及THROW_LAST)等用于異常處理的宏,其本質(zhì)上也是標(biāo)準(zhǔn)C++的try、catch和throw的進(jìn)一步強(qiáng)化。MFC建議不再使用TRY、CATCH和THROW宏,而是直接使用標(biāo)準(zhǔn)C++的方式。
異常處理的一般格式為:
try{
被檢查語句
throw 異常
}
catch(異常類型1)
{
進(jìn)行異常處理的語句1
}
catch(異常類型2)
{
進(jìn)行異常處理的語句2
}
...
MFC較好地將異常封裝到CException類及其派生類中,自成體系,下表給出了MFC 提供的預(yù)定義異常:
| 異常類 | 含義 |
| CMemoryException | 內(nèi)存不足 |
| CFileException | 文件異常 |
| CArchiveException | 存檔/序列化異常 |
| CNotSupportedException | 響應(yīng)對不支持服務(wù)的請求 |
| CResourceException | Windows 資源分配異常 |
| CDaoException | 數(shù)據(jù)庫異常(DAO 類) |
| CDBException | 數(shù)據(jù)庫異常(ODBC 類) |
| COleException | OLE 異常 |
| COleDispatchException | 調(diào)度(自動(dòng)化)異常 |
| CUserException | 用消息框警告用戶然后引發(fā)一般 CException 的異常 |
下面對異常處理補(bǔ)充幾點(diǎn):
(1)try和catch塊中必須要用花括號括起來,即使花括號內(nèi)只有一個(gè)語句也不能省略花括號;
(2)try和catch必須成對出現(xiàn),一個(gè)try_catch結(jié)果中只能有一個(gè)try塊,但可以有多個(gè)catch塊,以便與不同的異常信息匹配;
(3)如果在catch塊中沒有指定異常信息的類型,而用刪節(jié)號"...",則表示它可以捕獲任何類型的異常信息;
(4)如果throw不包括任何表達(dá)式,表示它把當(dāng)前正在處理的異常信息再次拋出,傳給其上一層的catch來處理;
(5)C++中一旦拋出一個(gè)異常,如果程序沒有任何的捕獲,那么系統(tǒng)將會(huì)自動(dòng)調(diào)用一個(gè)系統(tǒng)函數(shù)terminate,由它調(diào)用abort終止程序;
*/
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
?? ?int Erro=100;
?? ?char szErro[100]="我是異常";
?? ?try
?? ?{
?? ??? ?//只呢個(gè)捕獲一次
?? ??? ?//throw(Erro);
?? ??? ?throw(szErro);
?? ?}
?? ?catch(int i)
?? ?{
?? ??? ?printf("出現(xiàn)異常:Erro==%d\n",i);
?? ?}
?? ?catch(char * pErro)
?? ?{
?? ??? ?printf("%s\n",pErro);
?? ?}
?? ?catch(...)
?? ?{
?? ??? ?printf("捕獲任何類型的異常\n");
?? ?}
?? ?return 0;
}
總結(jié)
以上是生活随笔為你收集整理的C++异常处理try throw catch的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 让程序在崩溃时体面的退出之SEH
- 下一篇: MFC六大关键技术