首頁 >後端開發 >Golang >如何處理 Go 的 MGO DialWithTimeout() 失敗所引起的恐慌?

如何處理 Go 的 MGO DialWithTimeout() 失敗所引起的恐慌?

Linda Hamilton
Linda Hamilton原創
2024-11-24 17:39:18320瀏覽

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")
    }
}

在此修改後的程式碼中:

  • defer 區塊現在明確呼叫recover() 並將復原的值(恐慌)作為錯誤處理。這種緊急恢復會阻止程序退出。
  • 使用正確的 MongoDB 主機和連接埠(在本例中為 localhost:27017)呼叫 DialWithTimeout 函數。
  • 程式會列印一則訊息來指示是否成功連接MongoDB。

透過實作這個錯誤處理機制,可以優雅地處理以下情況: MongoDB 在不導致程式崩潰的情況下不可用。這允許您的應用程式繼續處理其他任務或優雅地失敗並顯示描述性錯誤訊息。

以上是如何處理 Go 的 MGO DialWithTimeout() 失敗所引起的恐慌?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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