LoginSignup
1
0

More than 3 years have passed since last update.

Go言語のエラーパッケージ aerrors をつくった

Last updated at Posted at 2020-12-07

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) をご覧ください。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0