如何在Golang中干净地将面向用户的错误与内部错误分开?
发布时间:2020-12-16 09:27:49 所属栏目:大数据 来源:网络整理
导读:我遇到了一个常见模式,我有一个接受用户输入的函数,并返回一个成功的输出值或错误.但它可以返回不同类型的错误,其中一些是用户输入错误的结果,另一些是内部错误导致的错误(例如,DB不可用). 我的函数有如下签名: // ProcessInput takes a user-input string
我遇到了一个常见模式,我有一个接受用户输入的函数,并返回一个成功的输出值或错误.但它可以返回不同类型的错误,其中一些是用户输入错误的结果,另一些是内部错误导致的错误(例如,DB不可用).
我的函数有如下签名: // ProcessInput takes a user-input string and returns a processed value func ProcessInput(input string) (ProcessedValue,error,error) {} 如果没有遇到错误,则第一个返回值是有意义的(不是nil),如果用户输入验证失败,则第二个返回值是错误,如果发生意外的内部错误,则第三个返回值是错误. 这样工作正常,但感觉不是很干净,从签名看不同的错误是不明显的.我考虑过命名错误返回,但我不喜欢命名返回参数的副作用. 我还能申请更清洁的其他模式吗?我是否应该有一个错误返回并按呼叫者方面的类型区分? 解决方法
返回多个错误对我来说似乎不太像.
为什么不使用名为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 } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |