0
我有以下連接到Mongo的功能。爲了測試,我關閉了mongod,並且希望程序在沒有可用時繼續使用mongo。如果服務器無法連接,MGO似乎會引發恐慌,所以我在下面寫了延遲/恢復,但恐慌仍然導致程序退出。什麼是從這個恢復的正確方法?Golang/MGO - 恐慌:無法訪問服務器
func connectToMongo(sess *mgo.Session, coll *mgo.Collection, sessionErr error) bool {
fmt.Println("enter main - connecting to mongo")
// tried doing this - doesn't work as intended
defer func() {
if r := recover(); r != nil {
var ok bool
err, ok := r.(error)
if !ok {
fmt.Printf("pkg: %v, error: %s", r, err)
}
}
return false
}()
maxWait := time.Duration(5 * time.Second)
sess, sessionErr = mgo.DialWithTimeout("localhost", maxWait)
if sessionErr == nil {
session.SetMode(mgo.Monotonic, true)
coll = session.DB("MyDB").C("MyCollection")
} else { // never gets here
fmt.Println("Unable to connect to local mongo instance!")
}
return true
}
無法重新創建錯誤。 'mgo.DialWithTimeout'只是返回一個錯誤,'沒有可達的服務器',而不是panicing。請包括'mgo'(版本)的導入路徑和恐慌消息(哪一行發生混亂) – ANisus
請記住,「如果延遲函數具有任何返回值,則在函數完成時它們將被丟棄。」如果您想修改/提供返回值,您將需要使用如下所述的命名返回值:「...如果延遲函數是一個函數文字,並且周圍函數已命名範圍在文字中的結果參數,延遲函數可能會在返回之前訪問並修改結果參數。「 –