異常的思考

最近在C++項(xiàng)目中用異常竹捉,有一些總結(jié)尚骄,希望能得到大家斧正。

C++之父Bjarne Stroustrup在《The C++ Programming Language》中講到:

一個(gè)庫(kù)的作者可以檢測(cè)出發(fā)生了運(yùn)行時(shí)錯(cuò)誤状蜗,但一般不知道怎樣去處理它們(因?yàn)楹陀脩艟唧w的應(yīng)用有關(guān))鹉动;另一方面,庫(kù)的用戶知道怎樣處理這些錯(cuò)誤眶根,但卻無(wú)法檢查它們何時(shí)發(fā)生(如果能檢測(cè)属百,就可以再用戶的代碼里處理了族扰,不用留給庫(kù)去發(fā)現(xiàn)).Bjarne Stroustrup說(shuō):提供異常的基本目的就是為了處理上面的問(wèn)題定欧。基本思想是:讓一個(gè)函數(shù)在發(fā)現(xiàn)了自己無(wú)法處理的錯(cuò)誤時(shí)拋出(throw)一個(gè)異常扩氢,然后它的(直接或者間接)調(diào)用者能夠處理這個(gè)問(wèn)題.

《C++Primer》第5版中關(guān)于異常的描述是

“異常處理(exception handing) 機(jī)制允許程序中獨(dú)立開(kāi)發(fā)的部分能夠在運(yùn)行時(shí)就出現(xiàn)的問(wèn)題進(jìn)行通信并作出相應(yīng)的處理爷辱。異常使得我們能夠?qū)?wèn)題的檢測(cè)與解決過(guò)程分離開(kāi)來(lái)饭弓。程序的一部分負(fù)責(zé)檢測(cè)問(wèn)題的出現(xiàn),然后解決該問(wèn)題的任務(wù)傳遞給程序的另一部分咏花。檢測(cè)環(huán)節(jié)無(wú)須知道問(wèn)題處理模塊的所有細(xì)節(jié),反之亦然昏翰【馗福”

從以上可以看出窍株,異常機(jī)制只是一種錯(cuò)誤處理機(jī)制,它與我之前經(jīng)常用的返回true/false或錯(cuò)誤碼的方式所達(dá)到的目的一樣球订,只不過(guò)異常機(jī)制更為先進(jìn)(也是廢話,不先進(jìn)C++設(shè)計(jì)異常何用)冒滩,正如Bjarne Stroustrup書(shū)中所說(shuō)“異常處理機(jī)制是在傳統(tǒng)技術(shù)不充分开睡、不優(yōu)美和容易出錯(cuò)的時(shí)候提供的一種替代它的技術(shù)...異常處理機(jī)制提出了一種更規(guī)范的錯(cuò)誤處理風(fēng)格”篇恒,以前我總感覺(jué)用了異常就好像能夠提高程序的穩(wěn)定性胁艰,現(xiàn)在看來(lái)即使用了異常,程序該崩還是要崩奈梳。
下面是幾點(diǎn)關(guān)于異常如何使用的一些思考攘须。

1thorw異常

  • 程序出現(xiàn)問(wèn)題時(shí)候throw異常
    異常是只程序不應(yīng)該出現(xiàn)的情況殴泰,這與業(yè)務(wù)是密不可分的
  • 異常應(yīng)該包含異常描述于宙,觸發(fā)原因和發(fā)生位置等信息
  • 每個(gè)項(xiàng)目應(yīng)該有自己的異常類體系,通常應(yīng)該繼承至一個(gè)異臣璩祝基類
  • 如果函數(shù)拋出異常,應(yīng)該在注釋中說(shuō)明異常類型抹恳,和拋出原因员凝,方便調(diào)用者處理

2何時(shí)catch異常

  • 代碼有能力處理異常則catch。
    這句話并沒(méi)有看起來(lái)那么好理解奋献,什么叫做有能力處理異常健霹,如果出現(xiàn)Mysql數(shù)據(jù)庫(kù)斷掉的異常,代碼對(duì)數(shù)據(jù)庫(kù)進(jìn)行了重新連接瓶蚂,這叫做解決了斷掉的異常糖埋,顯而易見(jiàn)這樣做可以稱之為處理了異常。但是如果不對(duì)Mysql進(jìn)行重練窃这,而是直接切換到另一個(gè)數(shù)據(jù)庫(kù)例如sqlite瞳别,而對(duì)原先的Mysql的斷掉置之不理,這應(yīng)該也算是處理異常,雖然mysql的斷掉并沒(méi)有處理跑揉。所以,有能力處理異常應(yīng)該是???可以保證程序處于業(yè)務(wù)允許的狀態(tài)下運(yùn)行望侈。
  • 調(diào)用的函數(shù)中拋出與本項(xiàng)目異常體系不同的異常
    例如,項(xiàng)目里面用的異常都是基于std::exception 但是調(diào)用的boost函數(shù)會(huì)拋出 boost的異常岂丘,就需要進(jìn)行捕獲。
  • 需要對(duì)異常內(nèi)容進(jìn)行補(bǔ)充寨蹋,從而更方便調(diào)用者處理
  • 可以斷定上層調(diào)用者無(wú)法處理該異常
    這種情況多出現(xiàn)在頂層調(diào)用類中召娜,例如在典型的MVC框架中秸讹,用戶觸發(fā)View,View調(diào)用control劣欢,control調(diào)用model,此時(shí)Model會(huì)拋出異常,control發(fā)現(xiàn)無(wú)法處理該異常搔确,但通常情況下view也無(wú)法處理該異常,control應(yīng)該捕獲該異常
  • 在邊界代碼中
    包括系統(tǒng)涕蜂、框架調(diào)用的代碼,例如main函數(shù),框架回調(diào)函數(shù)中葱跋,系統(tǒng)和框架應(yīng)該不會(huì)捕獲你的異常。

3其它

  • 所有的異常處理都應(yīng)該日志記錄
  • 異常描述信息應(yīng)包含觸發(fā)的位置
  • 異常處理的日志信息應(yīng)包含捕獲的位置

4思考續(xù)

通過(guò)在項(xiàng)目中對(duì)異常的實(shí)踐荠卷,發(fā)現(xiàn)其實(shí)程序中多數(shù)情況是不能解決異常的,所做的只能是進(jìn)行異常記錄验庙,開(kāi)發(fā)人員定期分析異常日志來(lái)查找程序問(wèn)題搏恤,所以我正在考慮是否只在出異常的地方進(jìn)行異常記錄藤巢,不在進(jìn)行異常拋出了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末孩革,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子饱搏,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件眠冈,死亡現(xiàn)場(chǎng)離奇詭異布卡,居然都是意外死亡贸街,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)古沥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)逞频,“玉大人苗胀,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布拔莱。 她就那樣靜靜地躺著尊剔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上方淤,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了毙玻?” 一聲冷哼從身側(cè)響起运准,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蔓搞,失蹤者是張志新(化名)和其女友劉穎蒲祈,沒(méi)想到半個(gè)月后邀泉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體基括,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡夷恍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年醋安,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了磺芭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片放棒。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤孙蒙,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布透典,位于F島的核電站,受9級(jí)特大地震影響纪岁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜遗增,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一抡草、第九天 我趴在偏房一處隱蔽的房頂上張望步悠。 院中可真熱鬧,春花似錦鹦付、人聲如沸尚辑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)哆窿。三九已至,卻和暖如春厉斟,著一層夾襖步出監(jiān)牢的瞬間挚躯,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工擦秽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留码荔,地道東北人漩勤。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像缩搅,于是被迫代替她去往敵國(guó)和親越败。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容