Go言語のエラーパッケージ aerrors
をつくりました。
モチベーション
- 型っぽく使えるエラーがほしい
- デフォルトで呼び出し元情報がほしい
- 気軽にラップしたい
- いい感じにログに書き出したい
使い方
基本は既存のパッケージと同じ用に使用することができます。
errors.New
風に
err := aerrors.New("new error")
fmt.Println(err)
// Output:
// new error
fmt.Errorf
風に
err := aerrors.Errorf("error: %d", 42)
fmt.Println(err)
// Output:
// error: 42
aerrors
はスタンダードライブラリのエラーに加えてより詳細な情報を保持しています。
デフォルトでエラーレベルと呼び出し元の情報を保持しています。
err := aerrors.New("new error")
fmt.Printf("%+v", err)
// Output:
// new error:
// priority: Error
// callers: main.main:example/main.go:10
オプションでエラーレベルを変更することができます。
err := aerrors.New("new error", aerrors.Priority(aerrors.Info))
fmt.Printf("%+v", err)
// Output:
// new error:
// priority: Info
// callers: main.main:example/main.go:10
また、より詳細な情報を追加することも可能です。
err := aerrors.New("new error").WithValue(
aerrors.String("foo", "Foo"),
aerrors.Int("number", 42)
)
fmt.Printf("%+v", err)
// Output:
// new error:
// priority: Error
// callers: main.main:example/main.go:10
// foo: Foo
// number: 42
さらに、エラーを拡張して新たなエラーを作成することができます。
拡張したエラーは errors.Is
関数で真となるため、独自のエラー型のように扱うことも可能です。
appError := aerrors.New("app error")
err := appError.New("oops")
fmt.Println(err)
fmt.Printf("is parent: %v", errors.Is(err, appError))
fmt.Printf("parent: %v", err.Parent())
// Output:
// oops
// is parent: true
// parent: app error
fmt.Errorf
と同様に既存のエラーをラップすることも可能です。
appError := appError := aerrors.New("application error")
err := appError.Errorf("error: %w", errors.New("oops"))
fmt.Println(err)
// Output:
// error: oops:
// priority: Error
// parent: application error
// origin: oops
// callers: main.main:example/main.go:12
// - oops
詳しくは Godoc または ソース(Github) をご覧ください。