猿问

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

无论成功或恐慌,我的函数都必须返回一个字符串。


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 语句无法正常工作。


至尊宝的传说
浏览 114回答 1
1回答

SMILET

命名您的返回参数,然后您可以在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).
随时随地看视频慕课网APP

相关分类

Go
我要回答