使用 Error.Is 函数比较动态错误消息

Compare dynamic error message using Error.Is function

例如我有一条动态错误消息

metadata.name: invalid value "test-value"

“测试值”将是动态的,如果出现此错误模式,我需要做一些事情

如何使用Error.Is函数检查错误模式?

你说你的错误有一条动态消息。我认为你的意思是你正在定义一个满足 error 接口的类型。 (不过,如果您使用 fmt.Errorf,您 应该 为这个用例定义一个类型。

type invalidValueError struct {
  value string
}

func (e *invalidValidError) Error() string {
  return fmt.Sprintf("invalid value %q", e.value)
}

您可以使用 errors.As 检查任何给定错误是否属于此类型。这不仅会匹配错误本身,还会匹配它包含的任何错误。

if ive := (*invalidValueError)(nil); errors.As(err, &ive) {
  // got an *invalidValueError
}

尽可能避免匹配错误消息的文本。它们可以在不同的系统或不同的区域设置中更改,并且它们通常不在兼容性承诺范围内。