研究ノートに行く(72)-スタックエラー処理でサードパーティのライブラリエラーに行く

Packをgithub.com/pkg/errors使用すると、開発者errorはエラーメッセージのベルトスタック情報、行番号やその他の情報などのより高速で正確なポジショニングエラーを簡単に入力できます。

アイテムコードがより複雑で、バグを追跡する必要がある場合は、github.com/pkg/errorsこのエラー処理パッケージの使用をお勧めします。

インストール

go get -v github.com/pkg/errors

標準ライブラリパッケージとerrorsパッケージは同じ名前でNew()、機能があり、標準ライブラリからエラー処理を積み重ねるまでのエラー処理は非常に簡単です。次のコードは、errors.Wrap()関数エラー情報のパッケージ化を使用しています。

package main

import (
    "fmt"

    "github.com/pkg/errors"
)

var ErrNameEmpty = errors.New("Name can't be empty!")

func (s *Student) SetName(newName string) (err error) {
    
    
    if newName == "" || s.Name == "" {
    
    
        return ErrNameEmpty
    } else {
    
    
        s.Name = newName
        return nil
    }
}

type Student struct {
    
    
    Name string
    Age  int
}

func NewStu() (err error) {
    
    
    stu := &Student{
    
    Age: 19}
    e := stu.SetName("")

    if e != nil {
    
    
        return errors.Wrap(e, "set name failed!")
    } else {
    
    
        return nil
    }

}

func main() {
    
    
    e := NewStu()
    fmt.Printf("%+v\n", e)
}

最後Printf()に、プレースホルダー%+vエラーメッセージの設定が表示され、関数のファイル名や行などのスタック情報が表示されますが、プレースホルダーにはエラーメッセージ%sのみが表示されます。

情報のスタックを含む次のエラーメッセージにより、プログラマーは問題のある位置を簡単に見つけることができます。たとえばmain.go:30main.goファイルの30行にその位置が示されます。

Name can't be empty!
main.init
    main.go:9
runtime.main
    /src/runtime/proc.go:189
runtime.goexit
    /src/runtime/asm_amd64.s:1333
set name failed!
main.NewStu
    main.go:30
main.main
    main.go:38
runtime.main
    /src/runtime/proc.go:201
runtime.goexit
    /src/runtime/asm_amd64.s:1333
  • Wrap() この関数は、既存のエラーに基づいて、スタック情報と新しいプロンプト情報を同時に追加します。
  • WithMessage() この関数は、既存のエラーに基づいて新しいプロンプト情報を追加します。
  • WithStack()この関数は、既存のエラーに基づいてスタック情報を追加します。実際には、状況に応じて使用することができます。

このパッケージは比較的シンプルで実用的であり、標準ライブラリに含まれている可能性があるため、実際の本番環境で使用することをお勧めします。
さらなる環境変数GOTRACEBACKは、スタック情報の出力情報により大きな影響を及ぼします。異なる値は、詳細レベルを変える出力情報です。

  • GOTRACEBACK =なし
  • GOTRACEBACK =シングル(デフォルト値)
  • GOTRACEBACK =すべて
  • GOTRACEBACK =システム
  • GOTRACEBACK =クラッシュ

プログラムdebug.SetTraceback (level string)関数で変数を提供することができます。

おすすめ

転載: blog.csdn.net/wohu1104/article/details/113795455