failureでお手軽エラーハンドリング
2024/04/23 Goのエラーハンドリング 最新事情Lunch LT
morikuni
自己紹介
Goのアプリケーションで
ほどほどに簡単で
それなりに通用する
エラーハンドリングライブラリfailureの紹介
本日の内容
failureを作った理由
エラー処理をある程度パターン化して
エラー関連のコードをシンプルしたかったから
failureを作った理由
エラー処理のパターン化のために
アプリケーションのエラーに求められる性質は?
アプリケーションのエラーに求められる性質
アプリケーションエラーの実現方法
標準ライブラリでのエラー処理
errorsとfmtパッケージのみを使う場合
標準ライブラリでのエラー処理
標準ライブラリでのエラー処理
アプリケーション独自のエラーを設計する場合
エラーコード
type AppError struct {
ErrorCode string
StackTrace StackTrace
Args []any
}
エラー型
type UserError struct {
UserID string
}
type PermissionError struct {
Target Resource
}��
エラー値
type HTTPError int
アプリケーション独自のエラーを設計する場合
アプリケーション独自のエラーを設計する場合
最高!
�だけど選択肢が多すぎてどうすれば...
failureを使う場合
failureを使う場合
failureでのエラーの識別
type ErrCode string
const CodeBadRequest ErrCode = “BadRequest”
return failure.New(CodeBadRequest)
if failure.Is(err, CodeBadRequest) { … }
エラーコードを定義
(gRPC codes.Code等も使用可能)
エラーコードから�エラーを作成
エラーコードでエラーを識別
failureでのエラーの発生箇所の特定
B().Error() // main.B: main.A[CodeX]
func A() error { return failure.New(CodeX) }�func B() error { return failure.Wrap(err) }
エラー作成時に�スタックトレースを自動取得
スタックトレースから
関数名を含む�エラー文字列を自動生成
スタックトレースは�一番深いものを取り出して構造化ログなどに使える
for _, f := failure.CallStackOf(err).Frames() {� fmt.Printf(“%s:%d, ”, f.File(), f.Line())�} // main.go:7, main.go:9, ……
failureでのエラーの原因の特定
func ValidateSize(s string, size int) error {� if len(s) != size {� return failure.New(CodeX, failure.Context{� “s”: s,� })� }� return nil�}
ValidateSize(“a”, 3).Error()�// main.ValidateSize[CodeX]({s=a})
Error() の中に情報が入る
type Context map[string]string
エラーを返すときに�引数など、エラーの原因となった情報をContextにkey-value形式で付加
failureのお手軽導入手順
failureの導入手順 Step1. スタックトレースだけ手に入れる
これで err.Error() に関数名が自動で入るようになる�スタックトレースをログに出したい場合は failure.CallStackOf(err)�failure.Wrap を使うだけでもメリットはある
failureの導入手順 Step2. エラーコードへの置き換え(optional)
エラーコードを使うようになると failure.Translate(err, CodeY) �で元のエラーを残したままエラーコードを上書きしたりできるようになる
if errors.Is(err, ErrX) { return ErrY }�=> if failure.Is(err, CodeX) { return failure.Translate(err, CodeY) }
元のエラーが残る
failureのデメリット
failureのデメリット
結論
アプリケーションにあったエラーを
設計できるなら独自のエラー型を作ろう
それが難しいならfailureは悪くない選択肢
(だと思う)
結論
採用PR エンジニア募集中
株式会社XYZ
社員数 約10人 (エンジニア 4人)
AI画像生成アプリ HOP�APIはGo、画像生成はPython�Goで生成AIの非同期実行、オートスケールさせる仕組み作りなどをしている��興味がある方はDMください!
HOP
自分の顔をAIに学習させて
いろんな画像が作れる