ホームページ > バックエンド開発 > Golang > MGO を使用して Golang で「到達可能なサーバーがありません」パニックを防ぐ方法は?

MGO を使用して Golang で「到達可能なサーバーがありません」パニックを防ぐ方法は?

Susan Sarandon
リリース: 2024-11-28 15:08:11
オリジナル
925 人が閲覧しました

How to Prevent

MGO を使用した Golang のパニック回復: 「到達可能なサーバーがない」パニックの防止

Go で MGO ライブラリを使用して MongoDB インスタンスに接続する場合、インスタンスが利用できないかオフラインの場合、「到達可能なサーバーがありません」というパニックが発生する可能性があります。これにより、プログラムが予期せず終了する可能性があります。

この問題を防ぐために、Go の defer 関数と Recovery 関数を使用して回復メカニズムを実装できます。ただし、質問で提供されている解決策は効果的に機能していません。

修正コード:

以下は、パニックから正常に回復し、プログラムが実行を継続できるようにします:

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート