gpt4 book ai didi

go - 将外部错误映射到 golang 中的域错误

转载 作者:IT王子 更新时间:2023-10-29 02:09:02 25 4
gpt4 key购买 nike

我有一个名为 ComputeService 的服务类型,它实现了特定的域逻辑。服务本身依赖于名为 Computer 的接口(interface)的实现,该接口(interface)具有方法 Computer.Compute(args...) (value, error)。如图所示,Compute 本身可能会返回某些错误。

ComputeService 需要使用正确的域错误代码从一组域错误中发送适当的错误,以便可以完成转换,并且客户端也可以适本地处理错误。

我的问题是,Computer 实现应该将它们的失败包装在域错误中,还是 ComputeService 应该这样做。如果是 ComputeService 执行此操作,那么它将必须了解 Computer 接口(interface)的不同实现返回的不同错误,在我看来这打破了抽象。两种方式的演示如下:

package arithmetic
type Computer struct {
}
func (ac Computer) Compute(args ....) (value, error) {
// errors is a domain-errors package defined in compute service project
return errors.NewDivideByZero()
}

package compute
type Service struct {
}
func (svc Service) Process(args...) error {
computer := findComputerImplementation(args...)
val, err := computer.Compute(args...)
if err != nil {
if err == arith.ErrDivideByZero {
// converting an arithmetic computer implementation
// specific error to domain error
return errors.NewDivideByZero()
} else if err == algebra.ErrInvalidCoEfficient {
// converting an algebraic computer implementation
// specific error to domain error
return errors.NewBadInput()
}
// some new implementation was used and we have no idea
// what errors it could be returning. so we have to send
// a internal server error equivalent here
return errors.NewInternalError()
}

}

最佳答案

Computer 的实现者应该用域错误来响应,因为它们是最接近操作的错误并且最能确定错误是什么。正如您所说, ComputeService 中的逻辑打破了抽象。如果您需要将代码从特定的 Computer 错误映射到域错误,请创建将主要逻辑与该错误包装代码分开的包装器结构。

要保留内部错误上下文,只需将原始错误嵌入到域错误中并制作 IsSpecificDomainError 帮助程序。

type MyDomainError struct {
Err error
}

func NewMyDomainErr(err error) error {
return &MyDomainError{err}
}

func IsMyDomainError(e error) bool {
_, ok := err.(*MyDomainError)
return ok
}

关于go - 将外部错误映射到 golang 中的域错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52621681/

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