首頁 >後端開發 >Golang >如何使用 MGO 防止 Golang 中的「無法存取伺服器」恐慌?

如何使用 MGO 防止 Golang 中的「無法存取伺服器」恐慌?

Susan Sarandon
Susan Sarandon原創
2024-11-28 15:08:11926瀏覽

How to Prevent

使用MGO 在Golang 中進行恐慌恢復:防止「無法存取伺服器」恐慌

使用Go 連接中的MongoGO 實例連接到MongoDB 實例時,如果實例不可用或離線,則可能會遇到「無法存取伺服器」的恐慌。這可能會導致程式意外終止。

為了防止這個問題,我們可以使用Go中的defer和recover函數來實現復原機制。然而,問題中提供的解決方案並不能有效地運作。

修改後的程式碼:

以下是給定程式碼的修改版本,它成功地從恐慌中恢復並且允許程式繼續執行:

package main

import (
    "fmt"
    "time"
)

import (
    "labix.org/v2/mgo"
)

func connectToMongo() bool {
    fmt.Println("enter main - connecting to mongo")
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Unable to connect to MongoDB. Received panic:", r)
        }
    }()

    maxWait := time.Duration(5 * time.Second)
    session, err := mgo.DialWithTimeout("localhost:27017", maxWait)
    if err != nil {
        return false
    }

    session.SetMode(mgo.Monotonic, true)
    coll := session.DB("MyDB").C("MyCollection")

    if coll != nil {
        fmt.Println("Got a collection object")
        return true
    }

    fmt.Println("Unable to retrieve collection")
    return false
}

func main() {
    if connectToMongo() {
        fmt.Println("Connected")
    } else {
        fmt.Println("Not Connected")
    }
}

在這段程式碼中,我們使用defer 函數來捕捉由DialWithTimeout 通話。如果發生恐慌,我們會列印錯誤訊息並繼續執行程序,防止程序過早終止。

MongoDB 宕機時的輸出:

當MongoDB 宕機時,程式產生下列輸出:

enter main - connecting to mongo
Unable to connect to MongoDB. Received panic: no reachable servers
Not Connected

使用MongoDB 輸出Up:

當MongoDB 啟動時,程式會產生以下輸出:

enter main - connecting to mongo
Got a collection object
Connected

透過擷取恐慌並提供資訊豐富的錯誤訊息,我們可以確保程式繼續運作並可以優雅地處理臨時網路問題或 MongoDB 中斷。

以上是如何使用 MGO 防止 Golang 中的「無法存取伺服器」恐慌?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn