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

如果发生恐慌并在 golang 中的 defer func(){...}() 中处理

如果发生恐慌并在 golang 中的 defer func(){...}() 中处理

Go
至尊宝的传说 2021-12-20 09:49:56
无论成功或恐慌,我的函数都必须返回一个字符串。func getDBStoreStatus() string{    var replyMessage string    defer func() string{         if err := recover(); err != nil {              replyMessage = "Error happend."         }    return replyMessage    }()    //do something to store row into DB    db, err := sql.Open("mysql", "user1:password@/databaseName?charset=utf8")     newMessage, err := db.Prepare("INSERT .............    res, err := newMessage.Exec(...........    if err != nil {         panic(err)    }    replyMessage = "OK"    return replyMessage}如果延迟部分处理了恐慌,我如何返回一个字符串?您可以看到 defer 部分中的 return 语句无法正常工作。
查看完整描述

1 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

命名您的返回参数,然后您可以在defer方法中设置它:


func getDBStoreStatus() (replyMessage string) {

    defer func(){ 

        if err := recover(); err != nil {  

            replyMessage = "Error happend." 

        }

    }()


    //do something to store row into DB

    db, err := sql.Open("mysql", "user1:password@/databaseName?charset=utf8") 

    newMessage, err := db.Prepare("INSERT .............

    res, err := newMessage.Exec(...........

    if err != nil { 

        panic(err)

    }

    replyMessage = "OK"

    return replyMessage

}

请参阅关于延迟、恐慌和恢复的 Go 博客文章:


延迟函数可以读取并分配给返回函数的命名返回值。


在此示例中,延迟函数在周围函数返回后递增返回值 i。因此,此函数返回 2:


func c() (i int) {

    defer func() { i++ }()

    return 1

}

不过,我真的不明白这一点。你可以这样做:


    if err != nil { 

        return "Error happend."

    }

而不是panic(err).


查看完整回答
反对 回复 2021-12-20
  • 1 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

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