Go by Example: Recover

Go は、recover ビルトイン関数を使うことで、 panic から recover できるようになっています。 recover は、panic がプログラムを異常終了するのを止め、 実行を継続させます。

これが役に立つ例として、サーバーがあります。 サーバーは、クライアント接続の1つが致命的なエラーを出したとしても クラッシュさせたくありません。代わりに、サーバーはその接続を閉じ、 ほかのクライアントの処理を継続したいでしょう。実際、Go の net/http は、HTTP サーバーに同じことをしています。

package main
import "fmt"

この関数は panic を起こします。

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

recover は、defer 関数の中で実行する必要があります。 外側の関数が panic を起こした場合、defer が起動し、 その中の recover 呼び出しが panic をキャッチします。

func main() {

recover の戻り値は、panic の呼び出しに渡された error です。

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

mayPanic が panic を起こすので、このコードは実行されません。 main の実行は panic の時点でストップし、defer クロージャの 中で再開されます。

    fmt.Println("After mayPanic()")
}
Recovered. Error:
 a problem

Next example: Collection Functions.