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