为了账号安全,请及时绑定邮箱和手机立即绑定

处理 defer 中的错误

处理 defer 中的错误

Go
慕妹3146593 2023-07-17 16:26:34
我有一个打开数据库连接并返回它的函数。或者错误,如果发生了什么事情: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 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信