登录
首页 >  Golang >  Go问答

在Golang中实现松耦合的错误处理的方法

来源:stackoverflow

时间:2024-03-22 13:39:24 400浏览 收藏

在 Golang 中实现松耦合的错误处理时,一种惯用方法是将错误定义在不同的应用程序层级。例如,存储库层可以定义特定于其操作的错误(例如数据库错误和资源未找到错误)。控制器层则可以检查返回的错误,并根据需要处理它们,例如返回不同的 HTTP 状态代码(404 表示资源未找到,500 表示数据库错误)。通过这种方式,错误消息可以根据需要在应用程序的不同层级进行解耦和处理。

问题内容

考虑以下控制器和存储库。

var ErrNotFound = errors.New("not found")

type Resource struct {
   Name string
}

type repository interface {
   CreateResource(ctx context.Context, name string) (*Resource, error)
}

type Controller struct {
   Repo repository
}

func (c *Controller) CreateResource(ctx context.Context, name string) (*Resource, error) {
   r, err := c.Repo.CreateResource(ctx, name)
    
   // error checking ...
   if err != nil {
   }

   return r, nil
}

为了保持干净,控制器还定义了它希望任何存储库遵守的协议。同样的道理,任何哨兵错误都应该由控制器而不是存储库定义。我真的找不到任何以这种方式处理错误的例子,这让我怀疑这是否确实是正确的方法。我的问题是,在不同应用程序层之间解耦错误消息的惯用方法是什么?


正确答案


您可以在每个级别定义几个错误 假设存储库会抛出 errdb 和 errnotfound 您可以检查实际返回给您的错误是什么,并按照您想要的方式处理它。

r, err := c.Repo.CreateResource(ctx, name)
if errors.Is(err, repo.ErrNotFound) {
    //return 404
} else if errors.Is(err, repo.ErrDB ) {
    //return 500
}

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>