Go语言 使用堆栈跟踪创建自定义错误

x759pob2  于 2023-10-14  发布在  Go
关注(0)|答案(2)|浏览(119)

我尝试使用go-errors来包含我生成的错误的堆栈跟踪。我有一个自定义的HttpError类型,我也想包括堆栈跟踪。我最初的想法是用一个embed来做这件事,但我似乎不能嵌入它,因为类的名称(Error)与其中一个方法的名称相同。

package netutil

import (
  "github.com/go-errors/errors"
)

type HttpError struct {
  status int
  *errors.Error
}

func (h *HttpError) Error() string {
  return "Failed"
}

func NewHttpError(status int, message string) *HttpError {
  return &HttpError{
    status,
    errors.New(message),
  }
}

我收到以下错误:

tmp_error.go:12: type HttpError has both field and method named Error

有什么建议吗?

m528fe3b

m528fe3b1#

为什么不直接用inner-errorstack-trace这样合适的名字来命名这个内部错误呢?

type HttpError struct {
  status int
  StackTace *errors.Error
}

在其他语言/框架(如.NET和Java)中用于错误处理的类中,这似乎是相当常见的做法。
另一种选择是在创建错误时使用fmt.Sprintf将自定义消息与内部错误连接起来,使其保持为一个。
errors.New(fmt.Sprintf("This proprietary error happened! Stack trace: %s", message)) ;
如果你这样做,你就不会实现func (h *HttpError) Error(),因为你将依赖于嵌入式错误。

kdfy810k

kdfy810k2#

自从这个问题被提出以来,围棋错误模式已经发生了很大的变化。现在有一个standard way of wrapping errors into new errors,可能包含更多信息。然后,gitlab.com/tozd/go/errors(免责声明:我是它的维护者)添加额外的信息,例如堆栈跟踪或结构化细节。
所以你的例子可能看起来像这样:

package netutil

import (
  "gitlab.com/tozd/go/errors"
)

type HttpError struct {
  status int
}

func (h *HttpError) Error() string {
  return "Failed"
}

func NewHttpError(status int, message string) error {
  return errors.WithMessage(&HttpError{status}, message)
}

errors.WithMessagemessage前置到HttpError错误的错误消息中,并记录堆栈跟踪(如果错误还没有堆栈跟踪,HttpError就没有)。您可以格式化错误以获取堆栈跟踪:

fmt.Printf("%+v\n", err)

相关问题