ホームページ  >  記事  >  バックエンド開発  >  Go の MGO ライブラリで「到達可能なサーバーがありません」エラーを適切に処理するにはどうすればよいですか?

Go の MGO ライブラリで「到達可能なサーバーがありません」エラーを適切に処理するにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-24 11:35:15672ブラウズ

How Can I Gracefully Handle

Go でのパニック処理: MGO での「到達可能なサーバーなし」の処理

Go プログラムで MGO ライブラリを使用して MongoDB に接続すると、 「到達可能なサーバーがありません」エラーにより、プログラムがパニックを起こし、突然終了する可能性があります。 MongoDB 接続がない場合でもプログラムが実行を継続できるようにするには、このパニックから適切に回復することが重要です。

提供されたコードでは、パニックを捕捉するために、recover() 関数が使用されています。ただし、パニックが依然としてプログラムの終了につながるため、現在の実装では不十分です。これを修正するために、コードの修正バージョンを以下に示します。

package main

import (
    "fmt"
    "time"
)

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

func connectToMongo() bool {
    ret := false
    fmt.Println("enter main - connecting to mongo")

    // Defer and recover from potential panic
    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")
    }
}

この更新されたコードでは、recover() 関数が defer ブロック内で呼び出され、関数が戻る前に確実に実行されます。 connectToMongo() 関数内でパニックが発生した場合、recover() 関数がそれを捕捉し、パニック メッセージを出力します。これにより、プログラムが途中で終了するのではなく、実行を継続できるようになります。

この手法に従うことで、MGO で「到達可能なサーバーがありません」エラーを適切に処理することができ、MongoDB が利用できない場合でもプログラムの動作を継続できるようになります。 .

以上がGo の MGO ライブラリで「到達可能なサーバーがありません」エラーを適切に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。