我有以下连接到Mongo的功能。为了进行测试,我关闭了mongod,并希望允许该程序在w / 0 mongo不可用的情况下继续运行。如果无法连接服务器,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 }
运行您发布的代码的以下版本。尽量不要修改代码,至少不要更改行号的位置。这样,如果您发布堆栈跟踪,则数字将匹配。
package main import ( "fmt" "time" ) import ( "labix.org/v2/mgo" ) func connectToMongo() bool { ret := false fmt.Println("enter main - connecting to mongo") // tried doing this - doesn't work as intended defer func() { if r := recover(); r != nil { fmt.Println("Detected panic") var ok bool err, ok := r.(error) if !ok { fmt.Printf("pkg: %v, error: %s", r, err) } } }() maxWait := time.Duration(5 * time.Second) session, sessionErr := mgo.DialWithTimeout("localhost:27017", maxWait) if sessionErr == nil { session.SetMode(mgo.Monotonic, true) coll := session.DB("MyDB").C("MyCollection") if ( coll != nil ) { fmt.Println("Got a collection object") ret = true } } else { // never gets here fmt.Println("Unable to connect to local mongo instance!") } return ret } func main() { if ( connectToMongo() ) { fmt.Println("Connected") } else { fmt.Println("Not Connected") } }
当MongoDB启动时,我看到:
enter main - connecting to mongo Got a collection object Connected
当MongoDB关闭时,我看到:
enter main - connecting to mongo Unable to connect to local mongo instance! Not Connected
如果您没有看到相同的行为,请发布输出,包括看到的恐慌。