去检查自定义错误的类型

时间:2014-05-22 01:44:19

标签: error-handling go

我很难在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*

显然我错过了一些东西。

4 个答案:

答案 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) {...}

请参阅博客文章:https://blog.golang.org/go1.13-errors

答案 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)