Goではrecover 組み込み関数を使い、パニックからリカバリできます。recover はpanic をプログラムを中断させなくし、代わりに実行が継続できるようになります。
|
|
この機能が役立つ例を挙げましょう。クライアントの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()")
}
|