Go의 MGO DialWithTimeout() 실패 시 패닉을 처리하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2024-11-24 17:39:18
원래의
313명이 탐색했습니다.

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 블록은 이제 명시적으로 복구()를 호출하고 복구된 값(패닉)을 오류로 처리합니다. 이러한 패닉 복구는 프로그램이 종료되는 것을 방지합니다.
  • DialWithTimeout 함수는 올바른 MongoDB 호스트 및 포트(이 예에서는 localhost:27017)를 사용하여 호출됩니다.
  • 프로그램은 이를 나타내는 메시지를 인쇄합니다. MongoDB에 성공적으로 연결되었는지 여부.

이 오류 처리 메커니즘을 구현하면 프로그램 충돌 없이 MongoDB를 사용할 수 없는 상황. 이를 통해 애플리케이션이 다른 작업을 계속 처리하거나 설명 오류 메시지와 함께 정상적으로 실패할 수 있습니다.

위 내용은 Go의 MGO DialWithTimeout() 실패 시 패닉을 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿