(譯)Go 語言中異常處理的藝術(shù)

原文鏈接:The Art of Error Handling in Go

Go 語言的異常處理與其他語言截然不同,Go 語言中沒有 try catch 或 except。取而代之的是 Go 中的每一個(gè)函數(shù)都期待返回一個(gè) error 變量,調(diào)用者負(fù)責(zé)相應(yīng)的檢查及處理。當(dāng)函數(shù)返回異常時(shí),有 5 種常見的策略進(jìn)行處理:

  1. 策略一:向外層傳遞異常

    因此,子函數(shù)的異常將被視為程序執(zhí)行失敗。這個(gè)示例包含 2 個(gè)函數(shù),GetLink() 函數(shù)的中的異常向上傳遞到了 main 函數(shù)中。這在 Go 語言的異常處理中是非常常見的策略。
    image.png
  2. 策略二:異常拋出后進(jìn)行不斷重試

    對(duì)于一些未知或者臨時(shí)性異常,重試機(jī)制是是非常有益的。在徹底放棄之前可以通過增加延遲或者重試次數(shù)的限制進(jìn)行一些重試的操作。
    image.png
  3. 策略三:更優(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í)間。
  4. 策略四:日志與繼續(xù)執(zhí)行

    這種情況下,記錄異常的日志就足夠了,然后繼續(xù)執(zhí)行程序流程,也許還需要進(jìn)行一些功能降級(jí)。
    image.png

    在這里 redis 客戶端嘗試 ping 服務(wù)端,如果發(fā)生異常,只進(jìn)行日志的記錄并且其他操作繼續(xù)進(jìn)行。這個(gè)策略的執(zhí)行前提是產(chǎn)生的異常不會(huì)對(duì)程序的流程造成巨大影響。
  5. 策略五:忽略異常

    這也許是最糟糕的策略,那就是忽略異常繼續(xù)前行。
    image.png

    在這里 os.RemoveAll(dir) 函數(shù)如果拋出異常將被忽略,因?yàn)椴僮飨到y(tǒng)會(huì)定期清理 temp 目錄,所以即使 os.RemoveAll(dir) 執(zhí)行失敗也不會(huì)對(duì)程序流程造成影響。

    如果執(zhí)行此策略,忽略異常是可以的但是一定不要忘記寫文檔!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容