亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

處理 defer 中的錯誤

處理 defer 中的錯誤

Go
慕妹3146593 2023-07-17 16:26:34
我有一個打開數據庫連接并返回它的函數?;蛘咤e誤,如果發生了什么事情:OpenDbConnection(connectionString string, logSql bool) (*gorm.DB, error) 在此功能中我使用記錄器:logger := zap.NewExample().Sugar()defer logger.Sync()方法Sync()返回error,我忽略這個錯誤。在這種情況下最好的策略是什么?我可以重寫我的代碼以避免 linter 錯誤,但我仍然忽略錯誤:logger := zap.NewExample().Sugar()defer func() {    _ = logger.Sync()}()我可以返回錯誤,但我有正確的數據庫連接,我需要在調用函數中分析此錯誤以了解要做什么。
查看完整描述

2 回答

?
慕的地8271018

TA貢獻1796條經驗 獲得超4個贊

您可以命名返回的錯誤變量并在函數內的任何位置進行初始化。

在這里檢查這個測試代碼

OpenDbConnection(connectionString string, logSql bool) (db *gorm.DB, err error) {


? ? logger := zap.NewExample().Sugar()

? ? defer func() {

? ? ? ? err = logger.Sync()

? ? }()


? ? // some logic here


? ? return db, err


}


查看完整回答
反對 回復 2023-07-17
?
達令說

TA貢獻1821條經驗 獲得超6個贊

接受的答案的另一個陷阱是錯誤檢查,例如


OpenDbConnection(connectionString string, logSql bool) (db *gorm.DB, err error) {

    logger := zap.NewExample().Sugar()

    defer func() {

        errS := logger.Sync()

        if errS != nil {

           err = errS

        }

    }()


   // some logic here

如果變量是在調用函數之前的部分err設置的。原始錯誤可以被該錯誤覆蓋。some logicdeferlogger.Sync()


在Go 1.20中,errors.Join添加了 來處理多個錯誤


新函數errors.Join返回一個包含錯誤列表的錯誤。


OpenDbConnection(connectionString string, logSql bool) (db *gorm.DB, err error) {

    logger := zap.NewExample().Sugar()

    defer func() {

        err = errors.Join(err, logger.Sync())

    }()


   // some logic here

現在,如果發生任何錯誤,err將會被設置。如果兩個錯誤都存在,我們會收到一個新錯誤,其中它們與\n分隔符連接在一起。


查看完整回答
反對 回復 2023-07-17
  • 2 回答
  • 0 關注
  • 178 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號