Error handling

General Overview

Hyperledger Fabricのコードでは、Goが提供する標準的なエラー型の代わりに、ベンダーパッケージ github.com/pkg/errors を使用する必要があります。 このパッケージは、エラーメッセージを含むスタックトレースを簡単に生成し、表示することができます。

Usage Instructions

github.com/pkg/errorsfmt.Errorf()errors.New() のすべての呼び出しの代わりに使用する必要があります。 このパッケージを使用すると、コールスタックが生成され、エラーメッセージに追加されます。

このパッケージを使用するのは簡単で、あなたのコードに簡単な修正を加えるだけです。

まず、 github.com/pkg/errors をインポートする必要があります。

次に、あなたのコードによって生成されたすべてのエラーを更新して、 エラー作成関数 (errors.New(), errors.Errorf(), errors.WithMessage(), errors.Wrap(), errors.Wrapf()) のいずれかを使用するようにしてください。

注釈

利用可能なエラー作成関数の完全なドキュメントは、https://godoc.org/github.com/pkg/errors を参照してください。 また、Fabricコード用のパッケージの使用に関するより具体的なガイドラインは、以下の一般的なガイドライン (General guidelines) のセクションを参照してください。

最後に、ロガーまたは fmt.Printf() 呼び出しのフォーマットディレクティブを %s から %+v に変更して、 エラーメッセージと一緒にコールスタックを表示するようにします。

General guidelines for error handling in Hyperledger Fabric

  • ユーザーリクエストを処理している場合は、エラーをログに記録し、それを返す必要があります。
  • エラーがGoライブラリやベンダーパッケージなどの外部ソースから発生した場合は、 errors.Wrap() を使用してエラーをラップし、エラーのコールスタックを生成します。
  • エラーが他のFabricの関数に起因する場合は、エラーメッセージにさらにコンテキストを追加し、必要であれば errors.WithMessage() を使って、コールスタックは影響を受けないようにします。
  • パニックが他のパッケージに伝播することは許されません。

Example program

以下のサンプルプログラムでは、パッケージの使い方をわかりやすく説明しています:

package main

import (
  "fmt"

  "github.com/pkg/errors"
)

func wrapWithStack() error {
  err := createError()
  // do this when error comes from external source (go lib or vendor)
  return errors.Wrap(err, "wrapping an error with stack")
}
func wrapWithoutStack() error {
  err := createError()
  // do this when error comes from internal Fabric since it already has stack trace
  return errors.WithMessage(err, "wrapping an error without stack")
}
func createError() error {
  return errors.New("original error")
}

func main() {
  err := createError()
  fmt.Printf("print error without stack: %s\n\n", err)
  fmt.Printf("print error with stack: %+v\n\n", err)
  err = wrapWithoutStack()
  fmt.Printf("%+v\n\n", err)
  err = wrapWithStack()
  fmt.Printf("%+v\n\n", err)
}