このミスを2回やらかしたので備忘録として書いておきます。
やらかしたコード
- defer文の中で何らかの処理を行いたい。そこでエラーが発生したら、それをもちろんハンドリングしたい。その際に、以下のように書くと元々存在していたエラーを上書きしてしまう。
func hoge() error {
// 何らかの処理
defer func() {
err = cleanUp()
}
// 何らかの処理
return err
}
修正例
例えば以下のようにすれば、元の関数で発生したエラーと、defer文内で発生したエラーを両方とも検知できる。
import (
"go.uber.org/multierr"
)
func hoge() error {
// 何らかの処理
defer func() {
err = multierr.Append(err, cleanUp())
}
// 何らかの処理
return err
}