goark/errs パッケージ v1.2.1 をリリースした
おそらく私しか使ってないであろう,エラーハンドリング用の /github.com/goark/errs
パッケージ v1.2.1 をリリースした。
実は v1.2.0 でチョンボして v1.2.1 として出し直している。 ごめんペコン。
Go 1.20 で Unwrap() []error
メソッドを持つマルチエラーをサポートするようになったため,その対応。
たとえば,複数の原因エラーがある場合に,標準の errors
.Join()
関数などと組み合わせて
package main
import (
"errors"
"fmt"
"io"
"os"
"github.com/goark/errs"
)
func generateMultiError() error {
return errs.New("error with multiple causes", errs.WithCause(errors.Join(os.ErrInvalid, io.EOF)))
}
func main() {
err := generateMultiError()
fmt.Println(errors.Is(err, io.EOF)) // true
}
てな感じに書くことができる。 ちなみに
func main() {
err := generateMultiError()
fmt.Printf("%+v\n", err)
}
と書き換えて実行すると
$ go run sample4.go | jq .
{
"Type": "*errs.Error",
"Err": {
"Type": "*errors.errorString",
"Msg": "error with multiple causes"
},
"Context": {
"function": "main.generateMultiError"
},
"Cause": {
"Type": "*errors.joinError",
"Msg": "invalid argument\nEOF",
"Cause": [
{
"Type": "*errors.errorString",
"Msg": "invalid argument"
},
{
"Type": "*errors.errorString",
"Msg": "EOF"
}
]
}
}
マルチエラー部分もいい感じに JSON 出力できる。
以前の errs
.Cause()
関数には Deprecated
マークを付けた(マルチエラーに対応できないため)。
// Deprecated: should not be used
func Cause(err error) error {
for err != nil {
unwraped := errors.Unwrap(err)
if unwraped == nil {
return err
}
err = unwraped
}
return err
}
Deprecated
マークを付けた型や関数を使用すると lint などで注意喚起してくれる。
便利。
errs
.Cause()
関数の代わりと言ってはナニだが errs
.Unwraps()
関数を用意した。
func Unwraps(err error) []error {
if err != nil {
if es, ok := err.(interface {
Unwrap() []error
}); ok {
return es.Unwrap()
}
}
e := errors.Unwrap(err)
if e != nil {
return []error{e}
}
return nil
}
この関数を使えば原因エラーを []error
で返してくれる(原因エラーが単一の場合もスライスで返すので注意)。
マルチエラーを格納する独自の型を作ることも一瞬考えたが,標準の errors
.Join()
関数などで作れば必要十分だと思うし,足りなければ改めて考えるか。
ということで今回はここまで。
ブックマーク
参考図書
- プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
- Alan A.A. Donovan (著), Brian W. Kernighan (著), 柴田 芳樹 (翻訳)
- 丸善出版 2016-06-20
- 単行本(ソフトカバー)
- 4621300253 (ASIN), 9784621300251 (EAN), 4621300253 (ISBN), 9784621300251 (ISBN)
- 評価
著者のひとりは(あの「バイブル」とも呼ばれる)通称 “K&R” の K のほうである。この本は Go 言語の教科書と言ってもいいだろう。
- 初めてのGo言語 ―他言語プログラマーのためのイディオマティックGo実践ガイド
- Jon Bodner (著), 武舎 広幸 (翻訳)
- オライリージャパン 2022-09-26
- 単行本(ソフトカバー)
- 4814400047 (ASIN), 9784814400041 (EAN), 4814400047 (ISBN)
- 評価
2021年に出た “Learning Go” の邦訳版。私は版元で PDF 版を購入。 Go 特有の語法(idiom)を切り口として Go の機能やパッケージを解説している。 Go 1.19 対応。
- 実用 Go言語 ―システム開発の現場で知っておきたいアドバイス
- 渋川 よしき (著), 辻 大志郎 (著), 真野 隼記 (著)
- オライリージャパン 2022-04-22
- 単行本(ソフトカバー)
- 4873119693 (ASIN), 9784873119694 (EAN), 4873119693 (ISBN)
- 評価
版元のデジタル版を購入。 Go で躓きやすい点を解説していくのが最初の動機らしい。「◯◯するには」を調べる際にこの本を調べるといいかも。