国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

關(guān)于異常的使用心得

2019-11-17 04:38:41
字體:
供稿:網(wǎng)友
版權(quán)所有:Lythm
文章來源:東日制作室

  工欲善其事,必先利其器.在做一個(gè)項(xiàng)目時(shí)必定要先做好調(diào)試除錯(cuò)的預(yù)備在面向過程編程的時(shí)代都是以檢測(cè)返回的錯(cuò)誤代碼來判定錯(cuò)誤,可是這種方法的缺點(diǎn)是假如編寫某一操作的時(shí)候可能出現(xiàn)的錯(cuò)誤代碼(比如說硬件操作)太多,那么最終用戶將會(huì)陷入倒無窮無盡的檢測(cè)代碼中,可能會(huì)是這個(gè)樣子

UINT err=Functionxx(...);

if(err==xxx)
...
if(err==xxx)
...
...
...

省略100行

只有這樣程序才能在出現(xiàn)意外的時(shí)候有所相應(yīng)和恢復(fù),但是由于錯(cuò)誤處理太龐大了最終用戶很可能這樣

if(Functionxx()!=SUCEEDED)
exit(0);

這樣某些可能可以恢復(fù)的操作也無法幸免了,(比如說網(wǎng)絡(luò)連接超時(shí),終止運(yùn)行太過分了吧,只要彈出個(gè)對(duì)話框就行了)

在面向?qū)ο缶幊痰臅r(shí)候,不可否認(rèn),很多人仍然還是這樣排錯(cuò)的,其實(shí)各種面向?qū)ο蟮恼Z言都提供了異常處理的手段(比如說Object Pascal,C++,本文以C++為例)

下面是我的關(guān)于異常的一些使專心得

對(duì)于各種用戶來說,并不是每一種錯(cuò)誤都是他關(guān)心的,非凡是小組開發(fā)的時(shí)候比如某一模塊是關(guān)于文件操作的,那么編寫這個(gè)模塊的程序員只要注重關(guān)于文件操作失敗的異常就行了,而網(wǎng)絡(luò)模塊的程序員只要知道網(wǎng)絡(luò)出錯(cuò)的錯(cuò)誤處理就行了,因此,我們可以定義一個(gè)這樣的類

class CBasicException
{
CBasicException(...);
char* GetDescription();
UINT GetErrorCode();
...
};

然后再從這個(gè)類繼續(xù)幾個(gè)子類

CFileException,CNetException...

  然后和具體某一類錯(cuò)誤相關(guān)的具體的異常分別從上面的類里面繼續(xù),比如文件打開失敗,空間不夠...等等
  可以從CFileException繼續(xù),而連接超時(shí)..等等可以從CNetException繼續(xù),如此一來就將錯(cuò)誤分類了整個(gè)類層次是這樣的

CBasicException
/ /
CFileException CNetException
/ / / /
COpenFailed ... CTimeOut ... 進(jìn)入討論組討論。

之后將各個(gè)錯(cuò)誤碼和相應(yīng)的異常對(duì)應(yīng)起來,一些不太重要的信息可以封裝在一個(gè)異常里,比如文件打不開可能是空間不夠或共享沖突...,都可以放在一起,假如以后要專門處理某一樣,比如空間不夠,再從相應(yīng)的基類繼續(xù)即可(COpenFialed)

然后你的函數(shù)應(yīng)該這樣實(shí)現(xiàn)

CMyfunc()
{
...
throw Cxxx(...);
}

而在相應(yīng)的調(diào)用部分則可以這樣寫

void Operation1()
{
try{
Myfunc()
}
catch(CFileException& e)//處理文件
{
throw;//重新拋出,假如搞定就不用再拋出了
}
catch(CNetException& e)//網(wǎng)絡(luò)
{
...
throw;
}
}

這樣只要catch想要處理的異常就行了
但是你的主函數(shù)應(yīng)該這樣寫

void main()
{
try{
Opertion1();
Operation2();
Operation.....
...
}
catch(Cxxx& e)//處理未捕捉的重要異常
{
...

}
catch(CBasicException& e)//對(duì)你所封裝的錯(cuò)誤總的處理
{
...
}
catch(...)//其他異常,未被封裝,比如除0
{
...
}
}

這樣處理就合理多了
而且假如在異常的描述里加上出錯(cuò)地點(diǎn)就更好了,比如出錯(cuò)函數(shù)名
不過千萬不要將異常基類的catch寫在子類的上面否則子類的catch可能永遠(yuǎn)不會(huì)工作了
比如:

try{
...
}
catch(CBasicException& e)
{
...
}
catch(CFileException(& e)
{
...
}

這樣后面的catch就再也不會(huì)被執(zhí)行了

另外在類的構(gòu)造函數(shù)和析構(gòu)函數(shù)里不能返回值的,這時(shí)就只能用異常了
進(jìn)入討論組討論。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 吴桥县| 卢龙县| 炉霍县| 镇江市| 沅陵县| 新龙县| 灯塔市| 福清市| 广平县| 东山县| 定安县| 房产| 罗田县| 涪陵区| 罗山县| 宁海县| 洛隆县| 佛坪县| 阿鲁科尔沁旗| 平山县| 隆化县| 射阳县| 当阳市| 彭水| 上饶市| 栾城县| 历史| 丰宁| 张家口市| 姜堰市| 庆安县| 北海市| 合阳县| 马关县| 永胜县| 葫芦岛市| 奉节县| 景洪市| 沙湾县| 彝良县| 屏山县|