Go 語言的異常處理與其他語言截然不同,Go 語言中沒有 try catch 或 except。取而代之的是 Go 中的每一個(gè)函數(shù)都期待返回一個(gè) error 變量,調(diào)用者負(fù)責(zé)相應(yīng)的檢查及處理。當(dāng)函數(shù)返回異常時(shí),有 5 種常見的策略進(jìn)行處理:
-
策略一:向外層傳遞異常
因此,子函數(shù)的異常將被視為程序執(zhí)行失敗。這個(gè)示例包含 2 個(gè)函數(shù),GetLink() 函數(shù)的中的異常向上傳遞到了 main 函數(shù)中。這在 Go 語言的異常處理中是非常常見的策略。
image.png -
策略二:異常拋出后進(jìn)行不斷重試
對(duì)于一些未知或者臨時(shí)性異常,重試機(jī)制是是非常有益的。在徹底放棄之前可以通過增加延遲或者重試次數(shù)的限制進(jìn)行一些重試的操作。
image.png -
策略三:更優(yōu)雅的退出程序
如果程序在發(fā)生異常后已經(jīng)不可用,那么打印異常信息并優(yōu)雅的退出是更好的選擇,但這種策略的操作必須在 main 函數(shù)中進(jìn)行。
image.png
子程序或者子函數(shù)中產(chǎn)生異常,應(yīng)該將異常向上傳遞,并且子程序不應(yīng)該執(zhí)行退出策略。
異常日志的信息最好使用 log 包進(jìn)行打印,log 包提供了一些除異常信息以外的有用信息,這對(duì)長(zhǎng)時(shí)間運(yùn)行的程序來說是非常的有用處的。image.png
因此,log 包將給出異常的確切日期及時(shí)間。 -
策略四:日志與繼續(xù)執(zhí)行
這種情況下,記錄異常的日志就足夠了,然后繼續(xù)執(zhí)行程序流程,也許還需要進(jìn)行一些功能降級(jí)。
image.png
在這里 redis 客戶端嘗試 ping 服務(wù)端,如果發(fā)生異常,只進(jìn)行日志的記錄并且其他操作繼續(xù)進(jìn)行。這個(gè)策略的執(zhí)行前提是產(chǎn)生的異常不會(huì)對(duì)程序的流程造成巨大影響。 -
策略五:忽略異常
這也許是最糟糕的策略,那就是忽略異常繼續(xù)前行。
image.png
在這里 os.RemoveAll(dir) 函數(shù)如果拋出異常將被忽略,因?yàn)椴僮飨到y(tǒng)會(huì)定期清理 temp 目錄,所以即使 os.RemoveAll(dir) 執(zhí)行失敗也不會(huì)對(duì)程序流程造成影響。
如果執(zhí)行此策略,忽略異常是可以的但是一定不要忘記寫文檔!





