Go - 有条件地处理错误

Go - Handle Errors Conditionally

我有一个克隆多个 gitlab 存储库的代码。我依赖的库是"gopkg.in/src-d/go-git.v4"。如果存储库已经存在,克隆函数将 return 出错。

我想忽略这个错误并继续克隆存储库的循环。下面是我尝试使用 errors.New() 来解决问题,但是,它不起作用,因为 returned err 和新错误不匹配。

import (
   gitgo "gopkg.in/src-d/go-git.v4"
   "log"
   "errors"

)

var errRepoIsThere = errors.New("repository already exists")

_, err := gitgo.PlainClone(repoLocalPath, false, &gitgo.CloneOptions{})


if !errors.Is(err, errRepoIsThere) {
      log.Fatal(err)
    
}

来自 gitgo.PlainClone 的错误 return 定义如下:

https://pkg.go.dev/github.com/go-git/go-git/v5#pkg-variables

ErrRepositoryNotExists = errors.New("repository does not exist")

我已经回答了这个问题 并看到所有遮阳篷都不鼓励使用 err.Error() == err2.Error() 类型的错误处理。

在这种情况下,解决我的问题的正确方法是什么?

那个错误是一个包级别的 var - 本质上是一个单例 - 所以比较是合适的:

err == gitgo.ErrRepositoryNotExists

比较 .Error() 被认为是不好的做法,因为错误文本是偶然的(但假定包导出是可靠的)