Go でエラーのスタックトレースを出す 2

Go でエラーのスタックトレースを出す方法のメモその2

以前の記事 で外部ライブラリから返ってきたエラーのエラーメッセージは保持しつつ、独自に定義したエラーでラップするための実装を書いたのだが、別の書き方もあると思ったので別の書き方もメモする。

以前作ったOGP 画像生成ツールでエラーが出たときのエラーログが不親切だったのでエラーログ書き出しを修正したのだが、

package errors

import (
	"errors"
)

var (
	ErrorFontReadFailed              = errors.New("Failed to read font.")
)

このようにエラーを定義して、エラーが発生するファイルでは “github.com/pkg/errors” を import し

ftBin, err := ioutil.ReadFile(opt.FontPath)
if err != nil {
    err = errors.Wrap(e.ErrorFontReadFailed, err.Error())
    return
}

このように errors.Wrap を使うと、エラーログ書き出し時に

2021/11/06 23:24:22 Failed to read font.
open : no such file or directory
github.com/k1350/ogpgen/internal/ogpgen.NewOgpImage
        /home/k1350/ogpgen/internal/ogpgen/ogpgen.go:57
main.main
        /home/k1350/ogpgen/cmd/ogpgen/main.go:27
runtime.main
        /usr/lib/go-1.16/src/runtime/proc.go:225
runtime.goexit
        /usr/lib/go-1.16/src/runtime/asm_amd64.s:1371
exit status 1

独自に定義したエラーを使いつつ元のエラーメッセージも出力できた。

以前のやり方だと独自エラーを定義した場所もスタックトレースに書き出されてしまって無駄なので、今回の方法のほうがいいかもしれない。