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