Go by Example: リカバリ

Goではrecover組み込み関数を使い、パニックからリカバリできます。recoverpanicをプログラムを中断させなくし、代わりに実行が継続できるようになります。

この機能が役立つ例を挙げましょう。クライアントの1つの接続で重大なエラーが発生しても、サーバーをクラッシュさせたくはありません。その代わり、サーバーはその接続を終了し、他のクライアントへのサービスを続行したいです。実際、これはGoのnet/httpがデフォルトでHTTPサーバーに対して行うことです。

package main
import "fmt"

この関数はパニックになります。

func mayPanic() {
    panic("a problem")
}

recoverは遅延実行関数の中で呼び出す必要があります。囲んでいる関数がパニックを起こすと、遅延実行関数がアクティブになり、その中のrecover呼び出しがパニックをキャッチします。

func main() {

recoverの戻り値は、panic呼び出しで発生したエラーです。

    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered. Error:\n", r)
        }
    }()
    mayPanic()

mayPanicでパニックが発生するため、このコードは実行されません。mainの実行はパニックの時点で停止し、遅延実行クロージャの中で再開します。

    fmt.Println("After mayPanic()")
}
$ go run recover.go
Recovered. Error:
 a problem

次の例:文字列関数