Golangのスタックトレース
Golangではエラーのスタックトレースを出力してくれません。多くの言語で出力されるのにGolangにないなんてと思いました。。。C言語作者が作っているからですかね?
スタックトレースがないとエラー時のデバッグが無理なので探してみました。
pkg/errors
このパッケージは標準パッケージのerrorをラップして簡単に使うことができます。独自のエラー情報も追加できるし、ラップすることで簡単にスタックトレースを出力できます。
標準パッケージ
まずは標準パッケージのエラー出力についてです。main.goに下記を実装します。
package main import ( "errors" "fmt" ) func main() { if err := one() { fmt.Printf("%+v", err) } } func one() error { return two() } func two() error { return three() } func three() error { return errors.New("error at three") }
この場合のエラーは一行のみ出力されます。
$ go run main.go error error at three
errors.New()
次にpkg/errorsのスタックトレース出力です。errors.New()は同じ関数があるのでimportするものだけ変更すれば完了です。
package main import ( "fmt" "github.com/pkg/errors" ) func main() { if err := one(); err != nil { fmt.Printf("%+v\n", err) } } func one() error { return two() } func two() error { return three() } func three() error { return errors.New("error at three") }
pkg/errorsを使うとこの様になります。
$ go run main.go error at three main.three /Users/go/main.go:26 main.two /Users/go/main.go:21 main.one /Users/go/main.go:17 main.main /Users/go/main.go:11 runtime.main /usr/local/Cellar/go/1.10.2/libexec/src/runtime/proc.go:198 runtime.goexit /usr/local/Cellar/go/1.10.2/libexec/src/runtime/asm_amd64.s:2361
一目瞭然でスタックトレース付きの方がわかりやすいですね。
erros.WithStack()
他にも外部パッケージからのエラーに対してもスタックトレースを追加することができます。
package main import ( "fmt" "strconv" "github.com/pkg/errors" ) func main() { if err := one(); err != nil { fmt.Printf("%+v\n", err) } } func one() error { return two() } func two() error { return three() } func three() error { if _, err := strconv.ParseInt("", 32, 10); err != nil { return errors.WithStack(err) } return nil }
この場合も同様にスタックトレースを表示できます。
$ go run main.go strconv.ParseInt: parsing "": invalid syntax main.three /Users/go/main.go:26 main.two /Users/go/main.go:21 main.one /Users/go/main.go:17 main.main /Users/go/main.go:11 runtime.main /usr/local/Cellar/go/1.10.2/libexec/src/runtime/proc.go:198 runtime.goexit /usr/local/Cellar/go/1.10.2/libexec/src/runtime/asm_amd64.s:2361
おすすめ書籍
Go言語の初心者から上級者までしっかり学べる書籍となっています。
本書籍はサンプルコードが非常に豊富で、HTTP/Websockert通信、CLIツール、Google/Twitter API、MongoDB等を使った様々なアプリケーションの作り方を学べます。
Go言語特有のgorutine、channelに関してもしっかりと説明されているのでこの書籍を一通り写経するとGoの全体像がつかめるかと思います。もちろん自分は全て写経しました。
髙妻智一
最新記事 by 髙妻智一 (全て見る)
- Polkadot(Substrate)のアドレスとトランザクションについて - 2023-03-09
- 【無料公開】「Goで始めるBitcoin」3章 Bitcoinノードとの通信 技術書典8 - 2020-03-08
- エンジニアがゼロから技術ブログを書くための方法をまとめました - 2019-05-25
コメントを残す