首頁 >後端開發 >Golang >將單一錯誤傳遞給errors.Join 有問題嗎?

將單一錯誤傳遞給errors.Join 有問題嗎?

WBOY
WBOY轉載
2024-02-09 11:03:071153瀏覽

将单个错误传递给errors.Join 有问题吗?

php小編新一在解決錯誤處理時,常常會遇到將單一錯誤傳遞給errors.Join的問題。這個方法是用來將多個錯誤訊息拼接成一個字串,方便錯誤日誌的記錄和檢視。但是,我們需要注意的是,如果錯誤訊息過多或過長,拼接後的字串可能會超出系統的限制,導致部分錯誤訊息遺失。因此,在使用errors.Join時,我們需要仔細考慮錯誤訊息的數量和長度,以確保錯誤的完整記錄和排查。

問題內容

go 1.20 引入了 errors.join 函數,可以包裝多個錯誤。呼叫此函數並且僅傳遞一個錯誤是否存在任何問題?

例如,本文建議不要對可寫檔案使用 defer f.close() 習慣用法,因為這會默默地忽略 close 傳回的任何錯誤。相反,它建議使用命名返回值 err 來允許傳播 close 的返回值 - 除非這樣做會覆蓋先前的錯誤:

defer func() {
    cerr := f.close()
    if err == nil {
        err = cerr
    }
}()

在這種情況下使用 errors.join 似乎更正確:

defer func() {
    cerr := f.Close()
    err = errors.Join(err, cerr)
}()

如果 errcerr 都非零,則現在將傳回兩個錯誤。如果都是nil,則傳回nil

但是,如果一個是nil 而另一個是非nil,則errors.join 不僅會傳回非nil 錯誤,也會回傳一個errors.joinerror 圍繞它的包裝器。包裝這樣的錯誤會導致任何問題嗎?特別是如果呼叫堆疊中的多個函數使用這種方法,那麼單一錯誤可能會在多層包裝器中結束?

解決方法

如果errors.joinerror 只有一個非零錯誤,那仍然是一個連接錯誤,並且errors.aserrors.is 函數按預期工作。無論連接錯誤的嵌套級別如何,這都是正確的。

唯一潛在的問題是如果有以下程式碼:

err:=someFunc()
if err==io.EOF {
  ...
}

那麼這將會失敗。必須重寫此程式碼才能使用 errors.is

以上是將單一錯誤傳遞給errors.Join 有問題嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除