- Goのランタイムが次に何をすれば良いか判断できない時に
panicが生成される
- 例えば、スライスの終わりを超えて読み込もうとしたり、
makeの引数に負の数字を指定したりするケース
- ガベージコレクターの誤動作やランタイム自体のバグを検出した時も
panicになるが、「ランタイムに原因がある」場合は非常に稀なので最後に考える
panicがなった時は第一に「プログラミングのエラーが原因である」ことを疑う
recoverは何が失敗したのかを明示してくれず、メッセージを出力して継続できるだけなので、できる限りpanicやrecoverに依存しないコードを書くよう心がける
panicとrecoverの実装例
package main
import (
"fmt"
)
func div60(i int) {
defer func() {
if v := recover(); v != nil {
fmt.Println(v)
}
}()
fmt.Println(60 / i)
// 60
// 30
// runtime error: integer divide by zero
// 10
}
func main() {
for _, val := range []int{1, 2, 0, 6} {
div60(val)
}
}