处理 defer 中的错误

问题描述 投票:0回答:2

我有一个函数可以打开数据库连接并返回它或在出现故障时返回错误:

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

在此功能中我使用

logger

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

方法

Sync()
返回
error
,我忽略这个错误。

这种情况下最好的策略是什么?

我可以重写我的代码以避免 linter 错误,但我仍然忽略该错误:

logger := zap.NewExample().Sugar()
defer func() {
    _ = logger.Sync()
}()

我可以返回错误,但我有一个有效的数据库连接,我需要在调用函数中分析此错误以知道该怎么做。

go
2个回答
16
投票

您可以命名返回的错误变量并在函数内的任何位置进行初始化。

检查此测试代码这里

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

}

5
投票

接受错误检查的答案的另一个陷阱,例如

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 logic
部分设置了
defer
变量。原始错误可以用
logger.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
分隔符连接起来。

© www.soinside.com 2019 - 2024. All rights reserved.