我有一个函数可以打开数据库连接并返回它或在出现故障时返回错误:
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()
}()
我可以返回错误,但我有一个有效的数据库连接,我需要在调用函数中分析此错误以知道该怎么做。
您可以命名返回的错误变量并在函数内的任何位置进行初始化。
检查此测试代码这里
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 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
分隔符连接起来。