KDOC 294: errorsは標準ライブラリと外部ライブラリで異なる

この文書のステータス

  • 作成
    • 2024-11-18 貴島
  • レビュー
    • 2024-11-19 貴島

概要

Go言語で、標準ライブラリ errors と外部ライブラリ github.com/pkg/errors は、パッケージ名は同じであるが、異なる。今まで、雑に errors で自動インポートされたほうを使っていた。

違いをかんたんに確認した。

package main
import (
        "fmt"
        "errors"
)
func main() {
        err := fmt.Errorf("wrapした: %w", errors.New("wrappedされた"))
        fmt.Printf("Error: %+v\n", err)
}
Error: wrapした: wrappedされた

標準ライブラリ。

  • ラップは fmt.Errorf とフォーマット指定子 %w で行う
  • 取り出しは AsIs で行う
  • スタックトレースは自動で保存してくれない
package main

import (
	"fmt"

	"github.com/pkg/errors"
)

func main() {
	// ラップあり
	if err := level1(); err != nil {
		fmt.Printf("Error: %+v\n", err)
	}

	fmt.Println("================")

	// ラップなし
	if err := doSomething(); err != nil {
		fmt.Printf("Error: %+v\n", err)
	}

}

func level1() error {
	return level2()
}

func level2() error {
	return errors.Wrap(doSomething(), "level2 failed")
}

func doSomething() error {
	return errors.New("something went wrong")
}
Error: something went wrong
main.doSomething
	/home/orange/go/src/playground/at-2024-11-17-231508/snippet.go:43
main.level2
	/home/orange/go/src/playground/at-2024-11-17-231508/snippet.go:39
main.level1
	/home/orange/go/src/playground/at-2024-11-17-231508/snippet.go:35
main.main
	/home/orange/go/src/playground/at-2024-11-17-231508/snippet.go:21
runtime.main
	/usr/local/go/src/runtime/proc.go:272
runtime.goexit
	/usr/local/go/src/runtime/asm_amd64.s:1700
level2 failed
main.level2
	/home/orange/go/src/playground/at-2024-11-17-231508/snippet.go:39
main.level1
	/home/orange/go/src/playground/at-2024-11-17-231508/snippet.go:35
main.main
	/home/orange/go/src/playground/at-2024-11-17-231508/snippet.go:21
runtime.main
	/usr/local/go/src/runtime/proc.go:272
runtime.goexit
	/usr/local/go/src/runtime/asm_amd64.s:1700
================
Error: something went wrong
main.doSomething
	/home/orange/go/src/playground/at-2024-11-17-231508/snippet.go:43
main.main
	/home/orange/go/src/playground/at-2024-11-17-231508/snippet.go:28
runtime.main
	/usr/local/go/src/runtime/proc.go:272
runtime.goexit
	/usr/local/go/src/runtime/asm_amd64.s:1700

外部ライブラリ。

  • ラップは Wrap で行う
  • 取り出しは Cause で行う
  • fmt.Printf%+v フォーマットを使うとスタックトレースを表示できる

関連

なし。