はじめに
golangci-lint
で、こんなエラーでた。defer
でエラーを返す関数をよんで、エラーを無視してたからみたい。
Error return value of `t.Disconnect` is not checked (errcheck)
修正前
こんな感じでやってた。 ローカルではtest通ってたけど、githubのCIでこけた。
もう、エラー無視してくれたらいいからって気分ではある。
func (t *hoge) hogeFunc(arg []byte) (hogeError error) {
ごにょごにょ
if err := t.Connect(); err != nil {
return err
}
defer t.Disconnect()
ごにょごにょ
}
func (t *hoge) Disconnect() error{
ごにょごにょ
}
修正後
調べると、無名関数にして、名前付き戻り値にしたエラーに代入したらよいみたい。main()
内なら、log.Fatal()
とかよんだらいいのかも。
deferのあとで、return err
してるところもあったので、そのまま代入しちゃうとdeferのあとでエラーがでても握りつぶしちゃうから、t.Disconnect()
がエラーのときだけ、代入した。deferのあとでエラーがあると、上書きしちゃうから、ほんとはappend的なことをしたほうがいいんやろうけど、サボった。
func (t *hoge) hogeFunc(arg []byte) (hogeError error) {
ごにょごにょ
if err := t.Connect(); err != nil {
return err
}
defer func() {
err := t.Disconnect()
if err != nil {
hogeError = err
}
}()
ごにょごにょ
}
おわりに
deferで、エラーあったときどうなるんやろうと思ってたけど、CI通らなかったので真面目に調べて、多少すっきりした。
ただ、自信はないので、変なところあったら、指摘お願いしたいです。
参考
【Go】 deferに渡した関数内のエラーを呼び出し元に返す - Qiita
Deferred Cleanup, Checking Errors, and Potential Problems -- Bleve