我遇到了一个常见的模式,我有一个接受用户输入的函数,并返回一个成功的输出值或错误.但它可以返回不同类型的错误,其中一些是用户输入错误的结果,另一些是内部错误导致的错误(例如,DB不可用).
我的函数有如下签名:
// ProcessInput takes a user-input string and returns a processed value
func ProcessInput(input string) (ProcessedValue, error, error) {}
Run Code Online (Sandbox Code Playgroud)
如果没有遇到错误,则第一个返回值是有意义的(不是nil),如果用户输入验证失败,则第二个返回值是错误,如果发生意外的内部错误,则第三个返回值是错误.
这样工作正常,但感觉不是很干净,从签名看不同的错误是不明显的.我考虑过命名错误返回,但我不喜欢命名返回参数的副作用.
我还能申请更清洁的其他模式吗?我是否应该有一个错误返回并按呼叫者方面的类型区分?
回归多次error对我来说似乎不是很像.
为什么不调用一个接口UserError来定义一个返回适合显示用户的消息的方法.如果未实现返回的错误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
}
}
}
Run Code Online (Sandbox Code Playgroud)