Golangでスタックトレースを出力できるpkg/errorsについて




Golangのスタックトレース

Golangではエラーのスタックトレースを出力してくれません。多くの言語で出力されるのにGolangにないなんてと思いました。。。C言語作者が作っているからですかね?

スタックトレースがないとエラー時のデバッグが無理なので探してみました。

pkg/errors

このパッケージは標準パッケージのerrorをラップして簡単に使うことができます。独自のエラー情報も追加できるし、ラップすることで簡単にスタックトレースを出力できます。

https://github.com/pkg/errors

標準パッケージ

まずは標準パッケージのエラー出力についてです。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の全体像がつかめるかと思います。もちろん自分は全て写経しました。

The following two tabs change content below.

髙妻智一

2013年CyberAgent新卒入社 スマホゲームを作る子会社に所属し、サーバーサイドのエンジニアを担当。2年目の終わりから新規子会社の立ち上げに参加し、サーバーサイドのエンジニアリーダーとしてサービースのリリースから運用までを担当。 2018年仮想通貨のスマホウォレットを提供するGinco Incにブロックチェーンエンジニアとして入社。






よく読まれている関連記事はこちら



コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です