5.3 エラーのチェック忘れを予防する

Javaなどの例外機構を持つ言語で例外が発生し得る場合、例外をチェックしないとコンパイルができません。しかしGoではエラーのハンドリングを忘れてしまった場合もコンパイルエラーは発生せず、正常にビルドできてしまいます。エラーのチェックを忘れてしまったことにより、エラーが発生した場所ではなく、意図しない場所でエラーや panic が発生し、調査が困難になってしまうことがあります。Goではエラーハンドリングがコンパイラーで強制されない代わりに、Linterなどを使ってエラーハンドリングが不十分な実装を検知できます。多くの場合、エラーのチェック忘れは実装者の意図していない場合がほとんどです。

5.3.1 kisielk/errcheckの利用

エラーのチェック忘れをLinterで検知する場合、サードパーティーの kisielk/errcheck というLinterがよく使われています。

以下のコードでは関数 a() からのエラーのチェックを忘れてしまっています。errcheck を使うことで、このようなエラーのチェック忘れを検知できます。

func main() {
	// エラーハンドリングを忘れている
	a()
}

func a() error {
	return errors.New("some error")
}
リスト5-2: 実行例
$ errcheck ./...
main.go:8:3:    a()

似たようなパターンとして、エラーを返す関数が複数あり得るときにif err != nil {} としてエラーはチェックしているけど、間違ったエラーをチェックしていることがあります。このような場合も errcheck で検知できます。以下は関数 ...