如果发生panic并在golang中延迟func(){...}()处理,如何使方法返回值

时间:2016-02-25 03:32:23

标签: go

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

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
}

如果由延迟部分处理恐慌,我怎么能返回一个字符串? 您可以看到延迟部分中的return语句无法正常工作。

1 个答案:

答案 0 :(得分:1)

命名您的返回参数,然后您可以在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
}

请参阅Defer, Panic and Recover上的Go Blog帖子:

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

         

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

    func c() (i int) {
        defer func() { i++ }()
        return 1
    }
    
  2.   
但是,我并没有真正看到这一点。你可以这么做:

    if err != nil { 
        return "Error happend."
    }

而不是panic(err)