后端系统开发之异常情况处理
智者千慮,必有一失。異常情況總是存在的,我們考慮不到全部場(chǎng)景。美劇《越獄》中精心策劃一切的男主也做不到,例如男主意外燙傷導(dǎo)致紋身地圖被毀。面對(duì)異常我們通常有兩種選擇,要么讓它c(diǎn)ore掉,要么繼續(xù)處理。
?
程序core掉的方法可以通過(guò)glog的FATAL級(jí)別日志,或者調(diào)用abort函數(shù)等方式終止程序。core掉的好處是很明顯的,它能將嚴(yán)重的錯(cuò)誤及時(shí)暴露出來(lái),以便及早處理。后端系統(tǒng)通常都設(shè)計(jì)有容錯(cuò)冗余機(jī)制,一個(gè)進(jìn)程core掉,其服務(wù)功能會(huì)自動(dòng)由同組的其他進(jìn)程來(lái)承擔(dān)(failover),因此沒(méi)有必要讓“生病的程序帶病工作”。
?
在計(jì)算機(jī)術(shù)語(yǔ)中,故障轉(zhuǎn)移(英語(yǔ):failover),即當(dāng)活動(dòng)的服務(wù)或應(yīng)用意外終止時(shí),快速啟用冗余或備用的服務(wù)器、系統(tǒng)、硬件或者網(wǎng)絡(luò)接替它們工作。(摘自維基百科:https://zh.wikipedia.org/wiki/故障轉(zhuǎn)移)
?
什么情況下應(yīng)該讓程序主動(dòng)core掉?最常見(jiàn)的情況是程序初始化資源失敗的情況。例如創(chuàng)建日志失敗、解析配置文件失敗、綁定服務(wù)端口失敗、創(chuàng)建內(nèi)存池或?qū)ο蟪厥〉?#xff0c;這些屬于程序運(yùn)行中必須使用的公共資源,一般是全局變量或單例形式,缺少這些資源程序無(wú)法提供正常功能。
?
但凡事總有例外,如果資源是可降級(jí)的,并非必不可少的,這個(gè)時(shí)候不應(yīng)core掉,而應(yīng)該記錄錯(cuò)誤日志,繼續(xù)運(yùn)行。還有一種情況可以考慮core掉,當(dāng)系統(tǒng)資源不足時(shí),例如內(nèi)存資源耗盡,new返回NULL。或者socket描述符、線(xiàn)程數(shù)達(dá)到系統(tǒng)最大限制時(shí),這時(shí)可以考慮讓程序主動(dòng)core掉,給它一次重生的機(jī)會(huì),也可以讓程序“帶著傷病”繼續(xù)運(yùn)行。
?
哪些異常情況程序不能core而應(yīng)該繼續(xù)工作?有些異常情況是程序事先要考慮周全的,網(wǎng)絡(luò)編程時(shí),要判斷消息是否合法,主動(dòng)關(guān)閉錯(cuò)誤或非法的連接。舉個(gè)例子,針對(duì)網(wǎng)絡(luò)爬蟲(chóng)流量、非法請(qǐng)求、非法參數(shù),程序要有應(yīng)對(duì)之策,而且絕對(duì)不能core掉,否則可能會(huì)出現(xiàn)大面積服務(wù)不可用這種尷尬情況。
?
在調(diào)用數(shù)學(xué)函數(shù)時(shí),需要滿(mǎn)足函數(shù)定義域要求,例如求平方根sqrt、求對(duì)數(shù)log等,需要保證參數(shù)值為非負(fù)數(shù)。在進(jìn)行除法運(yùn)算和求余運(yùn)算時(shí),需要保證被除數(shù)不為0。
?
使用系統(tǒng)調(diào)用或調(diào)用函數(shù)時(shí),需要判斷返回值,不能假定一定調(diào)用成功。使用指針時(shí)要非常小心,判斷是否為NULL、小心內(nèi)存泄漏和多次delete,盡可能使用智能指針而不是原生指針。最重要的一點(diǎn),要遵循C++編程規(guī)范,在設(shè)計(jì)和實(shí)現(xiàn)過(guò)程中保持對(duì)技術(shù)應(yīng)有的敬畏之心。
?
最后,簡(jiǎn)單說(shuō)下C++語(yǔ)言的異常處理,C++的異常處理try..catch最好別用,真正的C++工程代碼里很少使用異常。例如google protobuf的ParseFromArray在Java會(huì)拋異常,而C++版本是不拋異常的。寫(xiě)了屬于畫(huà)蛇添足。
金句分享
情商不高的例子有哪些?
對(duì)陌生人畢恭畢敬,對(duì)親近的人隨意發(fā)怒。
——來(lái)自知乎網(wǎng)友
解讀:不要對(duì)身邊的人發(fā)怒。
?
轉(zhuǎn)載于:https://www.cnblogs.com/zgwu/p/10588774.html
總結(jié)
以上是生活随笔為你收集整理的后端系统开发之异常情况处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: pyinstaller打包pyqt文件(
- 下一篇: java信息管理系统总结_java实现科