对于给定的自定义错误类型:
type CustomError struct {
// Err optionally wraps the original error.
Err error `json:"-"`
// Human readable message.
Message string `json:"message" validate:"required,gte=3"`
// StatusCode is a valid HTTP status code, e.g.: 404.
StatusCode int `json:"-"`
}
它实现了Error() string
和Unwrap() error
接口,也有一个工厂:
func NewCustomError(m string, s int, e error) *CustomError {}
如何基于CustomType
创建另一个“类型”-我们将其命名为FailedTo
,以解决 “创建X失败” 等错误,默认情况下将具有:
- 前缀为
Failed to
的Message
500
的状态代码
最重要的是,另一个,比如FailedToCreateSomething
,在某种程度上...。
func createSomething() error {
return FailedToCreateSomething(errors.New("File is busy"))
}
errCreateSomething := createSomething()
... errCreateSomething
是FailedToCreateSomething
的类型,也是FailedTo
和CustomError
的类型?
2条答案
按热度按时间fxnxkyjh1#
代码:
输出:
出现错误,无法读取文件,打开错误文件路径:系统找不到指定的文件。
xxls0lw82#
让我们从这个例子中提炼出它的精髓。
我们现在可以进入要点中的问题:
让我们将这个问题重新组织为如何创建一个包含新消息的
errSome
,其中errors.Is(errSome, FailedToWriteToFil)
包含。我们可以查看
errors.Is
的文档:报告err链中是否有任何错误与目标匹配。
该链由err本身以及通过重复调用Unwrap获得的错误序列组成。
如果一个错误等于一个目标,或者如果它实现了一个方法Is(error)bool,使得Is(target)返回true,则认为它匹配该目标。
错误类型可以提供Is方法,以便将其视为与现有错误等效。例如,如果MyError定义
func(m MyError)Is(目标错误)bool {返回目标== fs.ErrExist }
则Is(MyError{},fs.ErrExist)返回true。有关标准库中的示例,请参见syscall.Errno.Is。
这给了我们两条路径,其中一条路径是把
FailedToWriteToFile
放在Unwrap链上,如果我们使用Err字段指向FailedToWriteToFile
,CustomError有足够的字段来完成这个任务,例如:Unwrap()== to
FailedToWriteToFile
。如果您试图捕获来自另一个源的错误值,则FWIW Aux可能是error类型的字段。只要Unwrap()链最终指向FailedToWriteToFile
。另一种方法是在
CustomError
上定义一个Is
predicate 。有很多可能的 predicate 可供选择。一个简单的方法是将所有 *CustomError视为等效。这将是: