英文:
Compare dynamic error message using Error.Is function
问题
我有一个动态错误消息的例子
metadata.name: invalid value "test-value"
"test-value"将是动态的,如果出现这种错误模式,我需要做一些处理
如何使用Error.Is函数检查错误模式?
英文:
I have a dynamic error message for example
metadata.name: invalid value "test-value"
"test-value" will be dynamic, and I need to do something if this error pattern appears
How to check the errors pattern with Error.Is function?
答案1
得分: 1
你说你的错误消息是动态的。我认为你的意思是你正在定义一个满足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) {
// 得到一个*invalidValueError
}
尽量避免匹配错误消息的文本。它们可能会在不同的系统或不同的语言环境下发生变化,并且通常不受兼容性承诺的保证。
英文:
You say your error has a dynamic message. I think you mean that you're defining a type that satisfies the error
interface. (If you're using fmt.Errorf
instead though, you should define a type for this use case).
type invalidValueError struct {
value string
}
func (e *invalidValidError) Error() string {
return fmt.Sprintf("invalid value %q", e.value)
}
You can check whether any given error has this type using errors.As
. This will match not only the error itself, but any errors it's wrapping.
if ive := (*invalidValueError)(nil); errors.As(err, &ive) {
// got an *invalidValueError
}
Avoid matching the text of error messages if at all possible. They can change on different systems or in different locales, and they're generally not covered by compatibility promises.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论