gpt4 book ai didi

go - 如何在 Golang 中清楚地将面向用户的错误与内部错误区分开来?

转载 作者:IT王子 更新时间:2023-10-29 00:36:15 24 4
gpt4 key购买 nike

我遇到了一个常见的模式,我有一个函数接受用户输入,然后返回一个成功的输出值或一个错误。但它可以返回不同类型的错误,其中一些是错误的用户输入的结果,另一些是内部错误的结果(例如,数据库不可用)。

我的函数具有如下所示的签名:

// ProcessInput takes a user-input string and returns a processed value
func ProcessInput(input string) (ProcessedValue, error, error) {}

如果没有遇到错误,第一个返回值是有意义的(不是 nil),如果用户输入验证失败,第二个返回值是错误,如果发生意外的内部错误,第三个返回值是错误。

这工作正常,但感觉不是很干净,而且从签名中看不出有哪些不同的错误。我考虑过命名错误返回,但我不喜欢命名返回参数的副作用。

我可以应用任何其他更干净的模式吗?我应该在调用方返回单个错误并按类型区分吗?

最佳答案

返回多个 error 对我来说似乎不太像 Go。

为什么不使用一个名为 UserError 的接口(interface)来定义一个返回适合显示给用户的消息的方法。如果返回的错误未实现 UserError,则显示标准的“内部服务器错误”消息。示例:

type UserError interface {
error
UserError() string
}

type emptyInput struct {}

func (e emptyInput) Error() string {
return e.UserError()
}

func (emptyInput) UserError() string {
return "Empty input"
}

func ProcessInput(input string) (*ProcessedValue, error) {
if input == "" {
return nil, &emptyInput{}
}
}

func httpHandler() {
val, err := ProcessInput(input)
if err != nil {
if userErr := err.(UserError); userErr != nil {
// show userError.UserError() to user
} else {
// Log error
// show Internal server error message
}
}
}

关于go - 如何在 Golang 中清楚地将面向用户的错误与内部错误区分开来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38361919/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com