panic / recover【夏休みにGo vol.17】

こんにちは、しーたです。
今回は「予期せぬエラー出た場合にプログラムをできるだけ早く強制終了させる」のに用いられるpanicとrecoverについて学んでいきます。

※Goでは自分でpanic文を書くことは非推奨になっています。要は「予期せぬエラーなんて出さずに、ちゃんとエラー内容を返しなさい!」ってことです。

panic / recover

panic文が実行されると、できるだけ早くプログラムが強制終了されます。

またrecover文によってpanicの内容を取得」&「その関数内のdefer以外の実行は中断してdeferを順に実行、次の処理を続ける」ことができます。
これを使えばpanic発生後にその内容を表示することが可能です。

下記はsave関数内で読んだサードパーティの関数がpanicを起こした場合を想定しています。

save()内の"success"の表示は実行されず、recoverでpanicの内容が表示されていること、その後のmain()内の"hello!"の表示が実行されていることが分かります。

func thirdPartyConnectDB() {
	panic("Unable to connect database!")
}

func save() {
	defer func() { //defer文はpanic発生後にも処理される。
		s := recover() //panicの内容を取得できる。
		fmt.Println(s)
	}()
	thirdPartyConnectDB()  //呼んだサードパーティの関数内でpanicが出た場合を想定。
	fmt.Println("success") //実行されない。
}

func main() {
	fmt.Println("start.")
	save()
	fmt.Println("hello!") //実行される。
}

画像1


以上です。あまり馴染みは無いかもしれませんね。
それでは!

いいなと思ったら応援しよう!