golang recoverの使い方と注意点
今回はGo言語のrecoverについて解説していきます。
recover
Go言語では、プログラム内で発生するパニックを捉えて処理するメカニズムとしてrecover関数が用意されています。
recoverはdefer文と組み合わせて使用され、パニックが発生した際にプログラムの制御を取り戻すために用いられます。
recoverの使い方
recoverはdefer関数内で呼び出される必要があります。
defer関数は、囲んでいる関数がパニックにより異常終了する際にも確実に実行されるため、ここでrecoverを使用するとパニック時の情報を捕捉し、処理を続行できます。
package main
import "fmt"
func mayPanic() {
panic("a problem")
}
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered. Error:\n", r)
}
}()
mayPanic()
fmt.Println("After mayPanic()")
}
mayPanic関数内でパニックが発生しますが、main関数に設置したdefer関数がrecoverを呼び出し、パニックを捕捉します。これによりプログラムはクラッシュすることなく継続して実行されます。
golangの案件を探すならクラウドワークス テック
recoverの注意点
実行フローの制御
recoverを使用することでパニックを捕捉し、プログラムがクラッシュすることを防げますが、これが必ずしも良い設計とは限りません。
パニックは修復不可能なエラーやプログラマの誤りを示すため、適切なエラーハンドリングとしてpanicとrecoverに頼るべきではありません。
recoverのスコープ
recoverはdefer関数内でのみ効果を発揮します。
deferが設定された関数の直接のスコープ内でパニックが発生した場合にのみ、そのパニックを捕捉できます。defer関数外でrecoverを呼び出しても、パニックは捕捉されません。
デバッグの難しさ
recoverを使用することで、問題の原因が隠蔽されることがあります。開発中はrecoverを控えめに使用し、パニックの原因を解明することが望ましいです。
golangをもっと詳しくなりたい方に
初めてのGo言語
Go言語の入門から応用まではこの一冊で網羅されています。説明も順序立てて説明されており完成度の高い参考書となっています。
詳解Go言語Webアプリケーション開発
こちらはGo言語の基礎知識を得たあとに読むことをすすめる本となっています。ハンズオン形式で手を動かしながら実装をしていくことができるため、実際の開発を意識しながらGo言語を学ぶことができます。
以下の記事では他にも筆者が実際に読んでおすすめしたい本をまとめています。
【Go入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)
まだGo言語の勉強を始めていない方、全くの初心者の方にはこちらのUdemy教材が最もおすすめです。
この教材ではgolangの基礎について網羅的に学ぶことができます。ただ見て学ぶだけでなく、講座の中でアプリ作成まで行うことで学んだことの理解をさらに深めることができます。
現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発
個人的に最も勉強になったのは「現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発」という教材です。
本格的なレクチャーに入る前に、なぜGoなのか、なぜFintechなのかについて説明されていることで、Goの概念や意味について大枠から理解することができます。
以下の記事では筆者が実際に受講したおすすめUdemy教材をまとめています。