如何在Golang中实现解耦的错误处理?

vm0i2vca  于 2024-01-04  发布在  Go
关注(0)|答案(1)|浏览(94)

考虑下面的控制器和repo。

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
}

字符串
为了保持整洁,控制器还定义了它希望任何repo遵守的协议。同样,任何sentinel错误都应该由控制器定义,而不是由repository定义。我真的找不到任何这样处理错误的例子,这让我怀疑这是否是正确的方法。我的问题是,在不同的应用程序层之间解耦错误消息的惯用方法是什么?

gab6jxml

gab6jxml1#

你可以在每个级别上定义几个错误,比如仓库可以抛出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
}

字符串

相关问题