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