背景
我是 Go 新手,来自 C# 和 Java。所以返回错误的概念对我来说有点新。我已经习惯了,但我真的很怀念堆栈跟踪,它们在调试过程中非常有帮助。所以我正在考虑其他方法来包含我的错误的堆栈跟踪。
建议的替代方案
一个
Error
结构体,包装了 error
和堆栈跟踪。
type Error struct {
WrappedError error
StackTrace string
}
func (e *Error) Error() string {
return e.WrappedError.Error()
}
func (e *Error) Join(errs ...error) {
errs = append([]error{e.WrappedError}, errs...)
e.WrappedError = errors.Join(errs...)
}
func NewError(msg string) *Error {
return &Error{
WrappedError: errors.New(msg),
StackTrace: string(debug.Stack()),
}
}
调用代码看起来像这样,
func main() {
result, err := Foo()
if err != nil {
fmt.Println(err.Error())
fmt.Println()
fmt.Println(err.StackTrace)
return
}
fmt.Printf("result: %d", result)
}
func Foo() (int, *Error) {
//some additional logic
result, err := Bar()
if err != nil {
err.Join(errors.New("some msg from Foo level"))
return 0, err
}
return result, nil
}
func Bar() (int, *Error) {
//some additional logic
if 1 == 1 {
return 0, NewError("oops, something went wrong")
}
return 1, nil
}
这种方法允许我向我的
error
添加更多详细信息,同时还拥有所有现有功能。
问题