ホームページ > バックエンド開発 > Golang > Go の MGO DialWithTimeout() 障害でのパニックを処理する方法は?

Go の MGO DialWithTimeout() 障害でのパニックを処理する方法は?

Linda Hamilton
リリース: 2024-11-24 17:39:18
オリジナル
407 人が閲覧しました

How to Handle Panic in Go's MGO DialWithTimeout() Failure?

Go の MGO でのパニックの処理: DialWithTimeout() の失敗

次の状況を考えてみましょう: mgo ライブラリを使用して MongoDB インスタンスに接続する Go 関数があります。ただし、プログラムをクラッシュさせることなく、MongoDB が利用できない場合に対処したいと考えています。

元のコードは、遅延/回復メカニズムを使用してこれを実現しようとします。ただし、パニックによりプログラムは終了します。改訂されたアプローチを検討してみましょう:

package main

import (
    "fmt"
    "time"
)

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

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

    // Handle 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")
    }
}
ログイン後にコピー

この改訂されたコード:

  • 遅延ブロックは明示的にcover()を呼び出し、復元された値(パニック)をエラーとして処理するようになりました。このパニック リカバリにより、プログラムは終了できなくなります。
  • DialWithTimeout 関数は、正しい MongoDB ホストとポート (この例では、localhost:27017) を使用して呼び出されます。
  • プログラムは、次のことを示すメッセージを出力します。 MongoDB への接続が成功したかどうか。

このエラー処理メカニズムを実装することで、プログラムをクラッシュさせずに MongoDB を利用できない状況。これにより、アプリケーションは他のタスクの処理を続行することも、説明的なエラー メッセージを表示して正常に失敗することもできます。

以上がGo の MGO DialWithTimeout() 障害でのパニックを処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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