Replies: 8 comments 3 replies
-
很好的问题,从业务开发角度,无论是rpc访问的错误还是业务错误都返回error体验会更好,但需要有所区分(监控维度),如果是Thrift的话,对于业务错误建议定义 Thrift Exception,这样针对业务错误可以直接返回特定的error。 |
Beta Was this translation helpful? Give feedback.
-
首先,错误处理没有唯一标准,怎么做都可以,适合自己的是最好的。 其次,个人观点:业务错误和网络错误推荐分开。 主要是一个分工问题,业务大多不需要关心网络错误,网络错误由框架来解决,这样形成良好的分工,而合并返回错误违背了这一理念。 另外列举几个方面:
以上,欢迎讨论 ~ |
Beta Was this translation helpful? Give feedback.
-
我同意任何一种做法都是有合理的方面的,不同的场景下的设计肯定会针对性的选择,所以我现在这里讨论的重点不是方案的对错,而是方案的可行性、优劣势这些。 业务想要表达的完整信息的。如果是通过 error + response 来处理的话,对于业务来说就是要同时处理 error 和 response 了。 |
Beta Was this translation helpful? Give feedback.
-
这个问题,还是我在群里抛出的,因为实际场景中遇到这样的问题。 但是客户端接收到的数据是:remote or network error: internal exception: rpc error: code = 13 desc = biz error: 库存数量不小于0 所以这种情况下,只能 还是通过 response 返回,response 中带 一些业务状态 如:code:0 是成功,code:-1或者其他编码是失败,并带上失败的错误信息如:msg:"库存数量不小于0" 以上是我的见解。 |
Beta Was this translation helpful? Give feedback.
-
我同意楼上的在网络传输层上对 response 和 error 进行区分的传递数据,但是我认为在框架层面需要做一层转换与处理。比如楼上的例子,我写了如下的伪代码
以上是我的见解。 |
Beta Was this translation helpful? Give feedback.
-
@Luoxin 其实内部有一个与你写的类似的方案,但因为和thrift的体验不一样,对内部用户需要两套规范,所以之前未落实。 对pb的自定义异常方案考虑是这样的,增加 BizStatusError 提供用户创建自定义异常: type BizStatusError struct {
msg string
code int32
}
func NewStatusError(statusCode int32, msg string) *BizStatusError {
return &BizStatusError{code: statusCode, msg: msg}
}
func (e *BizStatusError) StatusCode() int32 {
return e.code
}
func (e *BizStatusError) Error() string {
return fmt.Sprintf("code=%s, msg=%s", e.code, e.msg)
}
func IsBizStatusError(err error) bool {
_, ok := err.(*BizStatusError)
return ok
} 服务端用户在 Handler 中通过 NewStatusError 构造 BizStatusError 返回 err。调用端判断是用户自定义异常,构造 BizStatusError 返回给调用端用户。 @Luoxin 你觉得是否OK |
Beta Was this translation helpful? Give feedback.
-
我个人想法是觉得,不管是业务错误还是逻辑错误都应该是 error 返回,至于这个错误是逻辑错误还是业务错误,是根据 error 的类型判断的。
我觉得不管是什么错误,最终都应该是错误,所谓就应该按照统一的 error 路径返回,而不是一部分错误通过 error 返回,一部分错误通过 response 返回。如果说一个 response 里面除了 error 之外还需要返回一些和 error 相关的信息,我觉得觉得是可以既然返回 error 又返回 response 的。无论是在接口请求上还是单纯的函数调用上
Beta Was this translation helpful? Give feedback.
All reactions