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フォーマットを使うとスタックトレースを表示できる