Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

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

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

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

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

Avatar for エブリー

エブリー

December 08, 2025
Tweet

More Decks by エブリー

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 はジェネリクスを活用し、型抽出のコードがより簡潔 になる