パニック(panic)とリカバー(recover)

パニック(panic)は、プログラムで問題が発生した際に処理を停止するための仕組み(関数)です。

リカバー(recover)は、パニックから回復するための仕組み(関数)です。

注意事項

パニックはプログラムが継続できない場合に止むを得ず使われるものです。 通常のプログラムでは原則使わないでください

パニックとリカバーの使い方

panic関数を呼び出すことで、パニックになります。

func main() {
    // パニックでプログラムが停止する
    panic("panic!")
}

deferの処理でrecover関数を呼び出すとパニックから回復します。

次のサンプルは、ライブラリを用いてDB接続を試行したところパニックが発生した想定です。

func main() {
    fmt.Println("before openDB")
    openDB()
    fmt.Println("after openDB")
}

func openDB() {
    // パニック発生時にdeferの処理が実行される
    defer func() {
        // パニックから回復
        r := recover()
        // panic関数に渡された値を参照
        fmt.Println("r:", r)
        // ここで回復処理をする
    }()
    fmt.Println("before dbLib")
    dbLib()
    fmt.Println("after dbLib")
}

func dbLib() {
    // パニック発生
    panic("panic!")
}

// 実行結果:
// before openDB
// before dbLib
// r: panic!
// after openDB