猿问

处理 defer 中的错误

我有一个打开数据库连接并返回它的函数。或者错误,如果发生了什么事情:


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()

}()

我可以返回错误,但我有正确的数据库连接,我需要在调用函数中分析此错误以了解要做什么。


慕妹3146593
浏览 136回答 2
2回答

慕的地8271018

您可以命名返回的错误变量并在函数内的任何位置进行初始化。在这里检查这个测试代码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}

达令说

接受的答案的另一个陷阱是错误检查,例如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分隔符连接在一起。
随时随地看视频慕课网APP

相关分类

Go
我要回答