goark/errs パッケージ v1.2.1 をリリースした

no extension

おそらく私しか使ってないであろう,エラーハンドリング用の /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() 関数などで作れば必要十分だと思うし,足りなければ改めて考えるか。 ということで今回はここまで。

ブックマーク

参考図書

photo
プログラミング言語Go
アラン・ドノバン (著), ブライアン・カーニハン (著), 柴田芳樹 (著)
丸善出版 2016-06-20 (Release 2021-07-13)
Kindle版
B099928SJD (ASIN)
評価     

Kindle 版出た! 一部内容が古びてしまったが,この本は Go 言語の教科書と言ってもいいだろう。感想はこちら

reviewed by Spiegel on 2021-05-22 (powered by PA-APIv5)

photo
初めてのGo言語 ―他言語プログラマーのためのイディオマティックGo実践ガイド
Jon Bodner (著), 武舎 広幸 (翻訳)
オライリージャパン 2022-09-26
単行本(ソフトカバー)
4814400047 (ASIN), 9784814400041 (EAN), 4814400047 (ISBN)
評価     

2021年に出た “Learning Go” の邦訳版。私は版元で PDF 版を購入。 Go 特有の語法(idiom)を切り口として Go の機能やパッケージを解説している。 Go 1.19 対応。

reviewed by Spiegel on 2022-10-11 (powered by PA-APIv5)

photo
実用 Go言語 ―システム開発の現場で知っておきたいアドバイス
渋川 よしき (著), 辻 大志郎 (著), 真野 隼記 (著)
オライリージャパン 2022-04-22
単行本(ソフトカバー)
4873119693 (ASIN), 9784873119694 (EAN), 4873119693 (ISBN)
評価     

版元のデジタル版を購入。 Go で躓きやすい点を解説していくのが最初の動機らしい。「◯◯するには」を調べる際にこの本を調べるといいかも。

reviewed by Spiegel on 2022-10-26 (powered by PA-APIv5)