Go Errors (Japanese)

"Errors" from golang wiki

Go公式WikiのErrorsの日本語意訳になります。
(元記事の最終更新日: 2014/12/10 rev.2)

エラーに関する簡単な説明がされています。
今だとpkg/errorsを使う人が多いかもしれません。
(元のエラー変数をラップし、呼び出し元で型スイッチでチェックしたり取り出したりすることができます)


エラー

エラーは関数の追加の戻り値として error を返却することによって示します。
値が nil となるのはエラーが無いことを意味します。

エラーは唯一のメソッドであるError()を呼ぶことで文字列になります。
errors.New()を使い、文字列からエラーを作成すことができます。

if failure {
    return errors.New("逆タキオンパルスに失敗しました") // 訳注: スタートレックのネタ...?
}

エラー文字列はプリフィクスが付くことが多いため、大文字で始めるべきではありません。

err := TryInverseTachyonPulse()
if err != nil {
    // 訳注: 以下ではエラーが、文章途中の%sの部分で表示されており、英語では小文字で始める方が適切となる。
    fmt.Printf("問題の解決に失敗しました: %s\n", err)
}

呼び出したコードがエラーを適切に処理するには、特別な値または新しい型を返却することで、エラーの種類を判別することができます。
エラー文字列でエラーの詳細を伝えるという方法によって、エラー処理することが予想できるため、違いを判別するだけです。(※? 訳出できず…)

io.EOF はストリームの終了を知らせる特別な値です。エラーの値はio.EOFと直接比較することができます。

もし追加のデータをエラーに持たせたい場合には、新しい型を使うことができます。

type ParseError struct {
	Line, Col int
}

func (p ParseError) Error() string {
	return fmt.Sprintf("パースエラーが発生しました。 行:%d, カラム:%d", p.Line, p.Col)
}

型スイッチを用いることで、特別なエラー型のテストができます。

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

命名

エラー型は “Error” で終わり、エラー変数は”Err”で始めます。

package somepkg

// ParseError はパースエラーが発生した場合に返却されるエラー型です。
type ParseError struct {
  Line, Col int
}

var ErrBadAction = errors.New("somepkg: 不正なアクションが行われました。")

// -----

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
             // ....
        }
    }
}

参考

 
comments powered by Disqus