我的專案包含一個自定義錯誤型別errNotFound,其中嵌入了一個錯誤。現在我有一個pkg/errors包,它會生成一個列印呼叫堆疊的錯誤。但是當我將此錯誤行內到 errNotFound 中時,不會列印呼叫堆疊。這是一個示例,我該如何更改它?
簡單的:
package main
import (
"fmt"
stderrors "errors"
"github.com/pkg/errors"
)
func findSomething() error {
return errors.Errorf("something not found")
}
func main() {
err := findSomething()
// can print error stack
exitf("Error1: % v", err)
fmt.Println()
fmt.Println()
// cannot print error stack
err = ErrNotFound(err)
exitf("Error2: % v", err)
}
func exitf(format string, args ...interface{}) {
fmt.Printf(format, args...)
//os.Exit(1)
}
type errNotFound struct{ error }
func ErrNotFound(err error) error {
if err == nil || IsErrNotFound(err) {
return err
}
return errNotFound{err}
}
func IsErrNotFound(err error) bool {
return stderrors.As(err, &errNotFound{})
}
輸出:
$ go run main
Error1: something not found
main.findSomething
/home/lianxm/github.com/play_error/main.go:11
main.main
/home/lianxm/github.com/play_error/main.go:15
runtime.main
/usr/local/go/src/runtime/proc.go:255
runtime.goexit
/usr/local/go/src/runtime/asm_amd64.s:1581
Error2: something not found
我知道我可以得到原始錯誤err = errors.Unwrap(err)然后列印它,但這意味著我每次列印前都需要這樣做,這不是非常優雅的代碼,我真的不想這樣做......
這是一個示例專案:https ://github.com/lianxmfor/play_error
uj5u.com熱心網友回復:
如果您已經擁有堆疊,是否有必要將錯誤放入另一個錯誤?
如果是...您可以為 errNotFound 定義一個方法,例如:
func (e errNotFound) Error() string {
return fmt.Printf("NotFound: % v", e.err)
}
uj5u.com熱心網友回復:
您需要使用堆疊注釋錯誤:
func ErrNotFound(err error) error {
if err == nil || IsErrNotFound(err) {
return err
}
return errors.WithStack(errNotFound{err})
}
uj5u.com熱心網友回復:
呼叫時exitf您可以使用errors.WithStack列印堆疊跟蹤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/422107.html
標籤:
上一篇:GoLang列印結構中變數的值
