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