ホームページ  >  記事  >  バックエンド開発  >  Go ルーチンでのパニックから回復するにはどうすればよいですか?

Go ルーチンでのパニックから回復するにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-07 13:51:03119ブラウズ

How Can I Recover from Panics in Go Routines?

Go ルーチンのパニックからの回復

Go ルーチンは、強力な同時実行メカニズムを提供し、独立したタスクの並列実行を可能にします。ただし、Go ルーチン内でのパニックの処理には課題が生じる可能性があります。

Go ルーチンでのリカバリについて

recover 関数を使用すると、関数のスコープ内で発生したパニックからリカバリできます。ただし、その有効性は、パニックが発生する同じゴルーチンに限定されます。他の goroutine でパニックから回復しようとすると失敗します。

コード例: パニック回復の失敗

次に、ある goroutine でパニックから回復できないことを示すコード スニペットを示します。 go ルーチン:

func main() {
    // Note: the following code will panic
    go handle(make(chan int64))

    for {}
}

func handle(done chan int64) {
    var a *int64
    a = nil

    fmt.Println(*a)
    done <- *a
}

このコードは、パニックを開始した同じ goroutine 内で回復を呼び出す必要があるため、ハンドル goroutine 内のパニックから回復できません。

コード例:パニック回復の成功

Go ルーチンでパニックから正常に回復するには、問題のある goroutine 内に defer Recovery ステートメントを追加する必要があります。期待どおりに動作する以前のコードの修正バージョンを次に示します。

func main() {
    done := make(chan int64)

    go func() {
        defer func() {
            if r := recover(); r != nil {
                fmt.Println("Recovered")
            }
        }()

        var a *int64
        a = nil

        fmt.Println(*a)
        done <- *a
    }()

    for {}
}

この例では、遅延回復ステートメントにより、ゴルーチンがパニックを適切に処理し、回復メッセージを記録できるようになります。

基礎となるメカニズム

Go ドキュメントによると、パニック終了は、現在のゴルーチン内のすべての遅延関数が実行された場合にのみ発生します。したがって、go ルーチンでパニックから回復するには、通常は遅延関数を介して、パニックを開始した同じゴルーチン内で回復を呼び出す必要があります。

以上がGo ルーチンでのパニックから回復するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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