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で行う
- 取り出しは AsやIsで行う
- スタックトレースは自動で保存してくれない
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フォーマットを使うとスタックトレースを表示できる
関連
なし。