我尝试使用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
有什么建议吗?
2条答案
按热度按时间m528fe3b1#
为什么不直接用
inner-error
或stack-trace
这样合适的名字来命名这个内部错误呢?在其他语言/框架(如.NET和Java)中用于错误处理的类中,这似乎是相当常见的做法。
另一种选择是在创建错误时使用
fmt.Sprintf
将自定义消息与内部错误连接起来,使其保持为一个。errors.New(fmt.Sprintf("This proprietary error happened! Stack trace: %s", message))
;如果你这样做,你就不会实现
func (h *HttpError) Error()
,因为你将依赖于嵌入式错误。kdfy810k2#
自从这个问题被提出以来,围棋错误模式已经发生了很大的变化。现在有一个standard way of wrapping errors into new errors,可能包含更多信息。然后,
gitlab.com/tozd/go/errors
(免责声明:我是它的维护者)添加额外的信息,例如堆栈跟踪或结构化细节。所以你的例子可能看起来像这样:
errors.WithMessage
将message
前置到HttpError
错误的错误消息中,并记录堆栈跟踪(如果错误还没有堆栈跟踪,HttpError
就没有)。您可以格式化错误以获取堆栈跟踪: