Go 言語の recover を使ったパニックの処理

Beginner

This tutorial is from open-source community. Access the source code

はじめに

Go 言語では、recoverはパニックから回復するために使用できる組み込み関数です。この実験では、recoverを使用してパニックを処理する能力をテストします。

回復

提供されたコードのmayPanic関数は、呼び出されたときにパニックを起こします。あなたのタスクは、main関数を修正してパニックから回復し、エラーメッセージを表示することです。

  • recover関数を使用して、mayPanic関数内のパニックを処理します。
  • パニックが発生したときにエラーメッセージを表示します。
$ go run recover.go
回復しました。エラー:
問題があります

以下に完全なコードがあります。

// Go 言語は、組み込み関数 `recover` を使用することで、パニックから回復することが可能です。`recover` は、パニックがプログラムを中断するのを防ぎ、代わりに実行を続けることができます。

// これが役立つ例:サーバーは、クライアント接続の 1 つが重大なエラーを示した場合にクラッシュしたくありません。代わりに、サーバーはその接続を閉じて、他のクライアントにサービスを続けたいと思います。実際、これが Go の `net/http` が HTTP サーバーに対してデフォルトで行っていることです。

package main

import "fmt"

// この関数はパニックを起こします。
func mayPanic() {
    panic("a problem")
}

func main() {
    // `recover` は、遅延関数内で呼び出す必要があります。
    // 囲まれた関数がパニックを起こしたとき、遅延処理が実行され、その中の `recover` 呼び出しがパニックをキャッチします。
    defer func() {
        if r := recover(); r!= nil {
            // `recover` の戻り値は、`panic` 呼び出しで発生したエラーです。
            fmt.Println("回復しました。エラー:\n", r)
        }
    }()

    mayPanic()

    // このコードは実行されません。なぜなら、`mayPanic` がパニックを起こすからです。
    // `main` の実行は、パニックの時点で停止し、遅延クロージャで再開されます。
    fmt.Println("mayPanic() の後")
}

まとめ

この実験では、Go 言語でパニックを処理するためのrecover関数の使い方を学びました。recoverを使用することで、プログラムがクラッシュするのを防ぎ、コードの実行を続けることができます。