Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

【登壇資料】Goのエラー管理を振り返ってみる

Avatar for エブリー エブリー
December 08, 2025
21

 【登壇資料】Goのエラー管理を振り返ってみる

20251208 GO・GMOペパボ・アンドパッド "Go" 同勉強会

Avatar for エブリー

エブリー

December 08, 2025
Tweet

Transcript

  1. 自己紹介 宮本 涼司 (@rymiyamoto/ パンダム) 株式会社エブリー 開発本部 開発1 部 トモニテグループ

    ゆるくインターネットが好きなオタクです 近況:登山キャンプしてきた
  2. エラーハンドリングのパターン(errors.Is / errors.As) errors.Is 値の厳密な一致 (`err == target`) 事前に定義されたエラー値の判定 errors.As

    型への代入が可能かをチェック エラー内の型固有の情報の抽出 抽出用のポインタ変数の定義が必須 var err = errors.New("error occurred") if errors.Is(err, target) { fmt.Println("Error is the target") } var mysqlErr *mysql.MySQLError if errors.As(err, &mysqlErr) { fmt.Println("MySQL error occurred:", mysqlErr.Number) }
  3. エラーハンドリングの流れ(errors.Is, errors.As) 内部では再帰的にエラーチェーンを辿り、特定のエラーが含まれているかをチェックしている ざっとの処理の流れはこんな感じ https://github.com/golang/go/blob/go1.25.4/src/errors/wrap.go 1. 現在のエラー値が、比較対象のターゲットエラー(target )と 厳密に等しいか(err ==

    target )をチェック or 特定の型に代入可能かをチェックして値を取得 2. 現在のエラーがUnwrap() メソッドを持っている場合、そのメソッドを呼び出してラップされた下位のエラーを取得 3. 下位のエラーに対して、再びステップ1 のチェックを実行
  4. errors.AsType によるエラーハンドリング(Go1.26 予定) Go1.26 で導入予定のAsType により、型を指定して値を取得することができる 抽出用のポインタ変数の宣言が不要になり、より簡潔な構文で値を取り出せる https://github.com/golang/go/blob/a846bb0aa523c8781248161b63bc2ab6a245cec1/src/e rrors/wrap.go#L153-L208 //

    ~ Go1.25 func RetrieveMysqlErrorCode(err error) (bool, uint16) { var mysqlErr *mysql.MySQLError // 一時変数の定義が必要 if errors.As(err, &mysqlErr) { return true, mysqlErr.Number } return false, 0 } // Go1.26 ~ func RetrieveMysqlErrorCode(err error) (bool, uint16) { if mysqlErr, ok := errors.AsType[*mysql.MySQLError](err); ok { // 不要な一時変数の定義が不要になり簡潔に! return true, mysqlErr.Number } return false, 0 }
  5. まとめ Go 1.13 で 再帰的エラーハンドリング(エラーチェーン) が導入され、コンテキスト保持 が可能に 既存の errors.Is と

    errors.As は内部的に再帰的にエラーチェーンを辿り、特定のエラーが 含まれているかをチェックしている Go1.26 で追加予定の errors.AsType はジェネリクスを活用し、型抽出のコードがより簡潔 になる