Go言語のエラー処理の特徴と、一般的なエラーハンドリングの方法について説明する
エラーは値
Goのエラーはerror
型のインターフェースを満たした単なる値として扱われる。
error
型はint
型などと同様にGoのランタイムに組み込まれている型で、インターフェースとして定義されている。
nil
値でエラーがないことを表す。
type error interface {
Error() string
}
errors.New()関数を使ってエラーを作成することが一般的。
func New(text string) error {
return &errorString{text}
}
type errorString struct {
s string
}
func (e *errorString) Error() string {
return e.s
}
panic()は使わない
Goにはpanic()
関数が存在し、プログラムを強制的に終了させることができるが、通常はエラー値での処理が推奨されている。
エラーハンドリング
Goの一般的なエラーハンドリングは、関数から返される末尾の戻り値としてerror
型を定義する。
func ReadFile(name string) ([]byte, error) {
// ...
}
エラーが発生したかどうかは、戻り値のerror
型がnil
かどうかで判断する。
ガード節を使用して、早期にエラーを処理し、ネストを浅く保つことが一般的。
f, err := os.Open("important.txt")
if err != nil {
// エラーハンドリング
}
// ...
他言語との違い
- Goのエラーハンドリングは他言語の例外処理と異なり、戻り値を確認してハンドリングするスタイル
Javaなどでは例外機構があり、try、catch、finally
を使用するが、Goではerror
値でエラーを表現し、呼び出し側で処理
参考