web-dev-qa-db-ja.com

カスタムエラーのタイプを確認する

Goでカスタムエラータイプを使用するのに苦労しています。私はこれを読みます エラーに関するブログ投稿

だから私はこれを試しました:

私のmodel.goでカスタムエラーを定義しました:

type ModelMissingError struct {
    msg string // description of error
}

func (e *ModelMissingError) Error() string { return e.msg }

私のメソッドの1つで、次のようなカスタムエラーをスローします。

...
return Model{}, &ModelMissingError{"no model found for id"}
...

そのメソッドの呼び出し元で、そのタイプについて返されたエラーを確認し、それが実際にModelMissingErrorである場合はアクションを実行します。

これを行うにはどうすればよいですか?

私はこれを試しました:

if err == model.ModelMissingError 

結果は*type model.ModelMissingError is not an expression*

明らかに何かが欠けています。

31
mconlin

ああ、わかったと思う。私はダムダムです。ブログの投稿を読むと、次のようなGoのビットがさらに公開されます。

serr, ok := err.(*model.ModelMissingError)

これはコンマokイディオムです。明らかに go lang tour をやり直す必要があります

42
mconlin

次のように、switchステートメントを使用してエラーアサーションを作成できました。

 err := FuncModelMissingError()

 switch t := err.(type) {
 default:
     fmt.Println("not a model missing error")
 case *ModelMissingError:
     fmt.Println("ModelMissingError", t)
}

これがお役に立てば幸いです。

12
miltonb

タイプ全体で検証する場合:

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)
0
suresh Palemoni