實作各種錯誤處理與資源管理方式。
程式設計的一個重點,就是即使發生錯誤,也要懂得如何處理錯誤並關閉資源。
這個練習要求你處理各種錯誤。由於錯誤處理與程式語言息息相關,你需要參考你正在學習的語言的測試,才能知道確切的要求。
如果你剛接觸 Go 的錯誤或 panic,建議先閱讀這方面的文件,先了解一下背景脈絡。
在這個練習中,你需要定義一個函式Use(opener ResourceOpener, input string) error,它會開啟資源、對取得的資源呼叫Frob(input),然後關閉該資源(無論發生什麼情況)。
你的函式應該妥善處理錯誤與 panic。
ResourceOpener opener是一個函式,你可以直接呼叫opener()來嘗試「開啟」資源。
它會以 Go 的慣用風格回傳一個Resource和一個錯誤值:
請參閱 common.go 檔案,了解Resource、ResourceOpener、FrobError和TransientError的定義。
你的解答要定義在與 common.go 和 error_handling_test.go 相同的套件裡:「erratum」。
這樣一來,你的解答就能使用這些型別。
你的Use函式中有幾個地方可能會發生錯誤:
呼叫當作第一個參數傳入 Use 的ResourceOpener函式時,它可能會以TransientError型別的錯誤失敗,若是如此,請持續嘗試開啟資源。
如果是其他種類的錯誤,就把它從你的Use函式回傳。
對ResourceOpener函式回傳的Resource呼叫Frob函式時,它可能會panic,並拋出FrobError(或其他型別的錯誤)。
如果確實是FrobError,你就必須呼叫該 Resource 的Defrob函式,並以 panic 的FrobError的.defrobTag變數作為Defrob函式的輸入。
無論如何,Use都應該回傳該錯誤。
另外請注意:如果Resource成功開啟,請務必確保無論如何都恰好呼叫它的Close函式一次(即使已經發生錯誤)。
測試特定錯誤型別可以透過型別斷言來進行。 你可能還需要看看具名回傳值,這是從 panic 復原時回傳錯誤資訊的實用做法。