我很难在Go中使用自定义错误类型。 我读了这个Blog post on Errors
所以我尝试了这个:
在我的模型中。我定义了一个自定义错误:
type ModelMissingError struct {
msg string // description of error
}
func (e *ModelMissingError) Error() string { return e.msg }
在我的一个方法中,我抛出一个这样的自定义错误:
...
return Model{}, &ModelMissingError{"no model found for id"}
...
在该方法的调用者中,我想检查为其类型返回的错误,如果它实际上是ModelMissingError
则采取措施。
我该怎么做?
我试过了:
if err == model.ModelMissingError
结果为*type model.ModelMissingError is not an expression*
显然我错过了一些东西。
答案 0 :(得分:41)
serr, ok := err.(*model.ModelMissingError)
这是逗号的成语,显然我需要重新做go lang tour
答案 1 :(得分:12)
我设法使用switch语句进行错误断言,如下所示:
err := FuncModelMissingError()
switch t := err.(type) {
default:
fmt.Println("not a model missing error")
case *ModelMissingError:
fmt.Println("ModelMissingError", t)
}
我希望这可以帮助你。
答案 2 :(得分:8)
现在,在Go 1.13中,我们可以使用errors
包中的以下内容:
if errors.Is(err, model.ModelMissingError) {...}
答案 3 :(得分:2)
如果您要验证各种类型:
switch err := errorFromFunction(); err.(type) {
case nil:
fmt.Println("No Error Function Executed Successfully")
case *ErrorType1:
fmt.Println("Type1 Error: ", err)
case *ErrorType2:
fmt.Println("Type2 Error", err)
}
如果您知道错误并想要验证:
err, ok := err.(*ErrorType1)