Go Wiki: エラー

エラーは、関数の追加の戻り値としてerrorを返すことで示されます。nil値はエラーがなかったことを意味します。

errorは、唯一のメソッドであるErrorを呼び出すことで文字列に変換できます。文字列からエラーを作成するには、errors.Newを呼び出します。

if failure {
    return errors.New("inverse tachyon pulse failed")
}

または、fmt.Errorfを使用します。

if failure {
    return fmt.Errorf("inverse tachyon pulse failed")
}

エラー文字列は、多くの場合、出力時にプレフィックスが付くため、大文字で始めるべきではありません。

err := TryInverseTachyonPulse()
if err != nil {
    fmt.Printf("failed to solve problem: %s\n", err)
}

呼び出し元のコードがエラーを処理できると予想される場合、特殊な値を返すか、新しい型を返すかして、エラーのクラスを区別できます。文字列はエラーの詳細を伝えることができるため、呼び出し元のコードがこの方法で処理できると予想される違いのみを区別する必要があります。

io.EOFは、ストリームの終わりを示す特殊な値です。エラー値をio.EOFと直接比較できます。

エラーに余分なデータを付加したい場合は、新しい型を使用できます。

type ParseError struct {
    Line, Col int
}

func (p ParseError) Error() string {
    return fmt.Sprintf("parse error on line %d, column %d", p.Line, p.Col)
}

定数文字列エラーを作成したい場合は、名前付き型文字列を使用できます。

type errorConst string

const ErrTooManyErrors errorConst = "too many errors found."

func (e errorConst) Error() string {
    return string(e)
}

呼び出し元のコードは、型スイッチを使用してerrorの特殊な型をテストします。

switch err := err.(type) {
case ParseError:
    PrintParseError(err)
}

命名

エラー型は"Error"で終わり、エラー変数は"Err"または"err"で始まります。

package somepkg

// ParseError is type of error returned when there's a parsing problem.
type ParseError struct {
  Line, Col int
}

var ErrBadAction = errors.New("somepkg: a bad action was performed")

// -----

package foo

func foo() {
    res, err := somepkgAction()
    if err != nil {
        if err == somepkg.ErrBadAction {
        }
        if pe, ok := err.(*somepkg.ParseError); ok {
             line, col := pe.Line, pe.Col
             // ....
        }
    }
}

参考文献


このコンテンツはGo Wikiの一部です。