panicとrecover
プログラムの強制終了を扱う際にpanicとrecover関数を用いる。
※実際にプログラムではpanicとrecoverを書くことは推奨されていない
panicでプログラムを強制終了させる。
panicは実行中のプログラムを停止させる組み込み関数。
ここでは、thirdPartyConnectDB関数を作成し関数内でpanic関数を呼び出す。panicの引数には「Unable to connect database」という文字列を指定する。このthirdPartyConnectDB関数を、saveという関数から呼び出し、main関数でsave関数を呼び出す。
main関数の最後にsave関数が実行できたか確認するために、「OK?」と表示される処理書く。このプログラム実行により、プログラムが強制終了し「panic(Unable to connect database)」とスタックトレースの情報が出力される。
※スタックトレースとは
プログラムの実行中にエラーや例外が発生した際に、そのエラーがどこで、どのような経路をたどって発生したのかを示す情報
以下の情報を含むことが多い:
・エラーが発生したメソッドや関数の名前
・エラーが発生したファイルの名前と行番号
・エラーが発生する前に呼び出されたメソッドや関数の呼び出し履歴
func thirdPartyConnectDB() {
panic("Unable to connect database")
}
func save() {
thirdPartyConnectDB()
}
func main() {
save()
fmt.Println("OK?")
}
//以下のように表示される
panic: Unable to connect database
goroutine 1 [runnning]:
main.thirdPartyConnectDB(...)
以下略
発生したpanicをrecoverで処理する
panicで発生したエラーを処理するためには、recoverを使用する。
save関数の中に、deferを使って遅延実行する関数リテラルを作る。関数リテラルでは、変数sにrecoverの返り値を入れて、fmt.Printlnで表示する。
deferで書いた関数を実行するためには後ろに()をつける。このプログラムを実行すると、panic関数とmain関数の最後に書いたしょりである「OK?」が表示される。
func thirdPartyConnectDB() {
panic("Unable to connect database")
}
func save() {
defer func() { //deferで関数を作成
s := recover()
fmt.Println(s)
}() //()をつけて実行
thirdPartyConnectDB()
}
func main() {
save()
fmt.Println("OK?")
}
//以下のように表示される
Unable to connect database
OK?
上記ではpanicのスタックトレースが表示されずにコードを実行することができた。
thirdPartyConnectDB関数で発生したpanicをsave関数の中のdeferで実行されたrecover関数がキャッチすることにより強制終了を防いでいる。
※注意
save関数のなかで、defer処理を定義する前にthirdPartyConnectDB関数を呼び出してしますとpanicでプログラムが終了してしまう。これは、deferでrecoverの遅延実行を指定する前に、panicが発生してしまうためである。
学習に使用した教材
・『入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)』M.A EduTech
https://www.udemy.com/course/golang-webgosql/?utm_medium=udemyads&utm_source=bene-msa&utm_campaign=responsive&utm_content=top-1&utm_term=general&msclkid=81e2f24a32cc185d275d953d60760226&couponCode=NEWYEARCAREERJP
・『シリコンバレー一流プログラマーが教える Goプロフェッショナル大全』酒井 潤 (著)
https://www.amazon.co.jp/%E3%82%B7%E3%83%AA%E3%82%B3%E3%83%B3%E3%83%90%E3%83%AC%E3%83%BC%E4%B8%80%E6%B5%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B-Go%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E5%A4%A7%E5%85%A8-%E9%85%92%E4%BA%95-%E6%BD%A4/dp/4046070897