← Go コース
43. エラーのラップ — %w と errors.Is / errors.As
エラーを上位へ返すとき、どこで何をしていて失敗したのかという文脈を足すと原因を追いやすくなります。fmt.Errorf の中で %w 動詞を使うと、元のエラーを包み込んだ(ラップした)新しいエラーを作れます。表示すると「外側の説明: 内側のエラー」のように連なり、元のエラーは内部に保持されたままになります。
ラップしたエラーから特定のエラーを判定するには errors.Is を使います。errors.Is(err, ErrNotFound) は、ラップの連鎖をたどって目的のエラー値が含まれているかを調べます。直接 err == ErrNotFound と比較すると、ラップされている場合に一致しないため、ラップを意識するなら errors.Is を使うのが正解です。
エラーの具体的な型を取り出して詳細フィールドを読みたいときは errors.As を使います。errors.As(err, &target) は連鎖の中から target の型に合うエラーを見つけて代入します。%w でラップし、判定は errors.Is、型取り出しは errors.As、というのが現代の Go におけるエラー処理の基本パターンです。
▶ サンプルコードを実行してみよう(自由に書き換えてOK)
Go