最近在極客時間上學習左耳朵耗子大佬的左耳聽風欄目,收益頗多,決定對從課程中學習到的東西進行總結(jié)記錄以加深印象。
今天學習的課程主要是對代碼中錯誤處理的方式從各個語言的實現(xiàn)角度做了介紹并提出了一些自己對于錯誤處理的最佳實踐,這里對??大佬提出的一些最佳實踐進行自己的理解和總結(jié)(說到錯誤處理就想到自從我入職之后從Java轉(zhuǎn)到Golang開發(fā),確實明顯感覺到了兩種語言對于異常錯誤處理的不一致,還經(jīng)常還無法習慣golang中的error處理形式)
1.統(tǒng)一分類的錯誤字典
這個在進行http接口開發(fā)的時候體會的比較深刻,因為http中的返回錯誤碼的形式就將錯誤進行了分類,2XX開頭的表示正常的請求,3XX表示重定向,4XX表示客戶端請求有問題,5XX表示服務端的問題。所以我后來做一些第三方調(diào)用接口的開發(fā)時偶爾會將錯誤進行分類用錯誤碼+msg的形式返回錯誤到調(diào)用方
2.同類錯誤的定義最好可以擴展
類似于Java中的Exception和Golang中的error可以用多態(tài)的方式做到代碼復用
3.定義錯誤的嚴重程度
感覺這個一般用在日志記錄的時候,根據(jù)問題嚴重性打印error,info,warning等級別的信息
4.錯誤日志輸出最好用錯誤碼而不是錯誤信息
確實在做開發(fā)時某些地方打印錯誤日志直接就把error或者Exception信息打印出來,導致在排查問題時沒有關(guān)鍵詞進行搜索很難找到出錯的那行日志在哪。所以打印錯誤信息的時候有必要增加一個標識符表示這個錯誤日志發(fā)生的地點,我現(xiàn)在一般都是用唯一性的一句description,這樣看來用錯誤碼好像是更高級點的方式
5.忽略錯誤要有日志
方便問題排查,不用多說
6.對于同一個地方不停報錯,最好不要都打到日志里
to do
7.不要用錯誤處理邏輯處理業(yè)務邏輯
就是要記住一個原則異常捕捉是用來處理不期望發(fā)生的事,比如空指針異常等,錯誤碼就可以用來處理可能會發(fā)生的事,比如第三方接口調(diào)用時可能出現(xiàn)的參數(shù)錯誤,鑒權(quán)信息有誤等
8.對同類錯誤的處理用同一種模式
主要是代碼規(guī)范
9.盡可能在錯誤發(fā)生的地方處理錯誤
todo
10.向上盡可能返回原始的錯誤
這個就踩過坑,在某次開發(fā)時我捕獲了一個方法的異常然后在異常處理中沒有將這個異常打印出來,然后還返回了一個很模糊的報錯信息給上層,導致最后排障的時候特別坑。。
11.處理錯誤時要清理以分配的資源
12.不推薦在循環(huán)體內(nèi)處理錯誤
一般把循環(huán)體整個放在一個try-catch內(nèi)
13.不要把大量代碼都放在一個try語句塊內(nèi)
14.為錯誤定義提供清楚的文檔以及每種錯誤的代碼示例
todo
15.對于異步的方式推薦用promise模式處理錯誤
在真實的開發(fā)中我還沒用過promise模式,覺得看著挺刁的以后找機會實踐一下