Go言語 のpanic とrecover について
panic について
Go言語には、例外処理のために一般に使われるerrors に加えて、panic という処理が存在する。
基本的には回復不能と判断された実行時エラーを発生させる機構。
recover について
panic を取得し、エラー処理を実装できる機構。これがないとプログラムはクラッシュしてしまう。
使用上の注意点
言語仕様なのでドキュメントを読めば書いてあるが、慣れた人ほど注意した方が良いこと
recover() は関数内部で実行されることで初めてpanicを受け取ってくれる
下記のコードを実行すると、panic が回収されず、そのままプログラムが終了する
package main
func main() {
recover()
panic("パニックが回収されませんでした")
}
一方で次のコードのように、関数内部で受け取ってやることでちゃんとpanicが回収されて、プログラムが正常に終了する
package main
import "fmt"
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("パニックが回収されました")
}
}()
panic("パニックが回収されませんでした")
}
以上のように、panic は正しく受け取ってあげないとプログラムが全落ちしてしまうので気をつけて使おう。