Go初心者必見!エラー処理の極意
エラー処理の基本
Go初心者が最初に直面する課題の一つが、エラー処理です。Goではエラーは error インターフェースとして扱われ、関数の戻り値として返されます。典型的なパターンは次のようになります。
func readFile(path string) ([]byte, error) {
data, err := os.ReadFile(path)
if err != nil {
return nil, err
}
return data, nil
}
上記のコードでは if err != nil でエラーをチェックし、エラーが発生した場合はそのまま返却しています。これがエラーハンドリングの基本です。
errors.Newとfmt.Errorfの使い分け
エラーを生成する際に使われる主な関数は errors.New と fmt.Errorf です。errors.New は単純な文字列をエラーに変換するだけで、フォーマットは行いません。
err := errors.New("ファイルが見つかりません")
一方、fmt.Errorf は fmt.Sprintf と同様にフォーマット文字列を受け取り、動的にメッセージを生成できます。エラーにコンテキストを付与したい場合に便利です。
err := fmt.Errorf("ファイル %s を読み込めません: %w", path, err)
ここで %w を使うと、元のエラーをラップして errors.Is や errors.As で判定できるようになります。Go初心者はこの違いを理解しておくと、後々のデバッグが楽になります。
実践例と安全性チェック
実際にエラー返却と安全性チェックを組み合わせた例を見てみましょう。以下は、ユーザー入力を検証し、必要に応じてエラーを返す関数です。
func validateAge(age int) error {
if age < 0 {
return fmt.Errorf("年齢は負数にできません: %d", age)
}
if age > 150 {
return errors.New("年齢が不自然に高すぎます")
}
return nil
}
呼び出し側では次のようにチェックします。
if err := validateAge(userAge); err != nil {
log.Printf("入力エラー: %v", err)
// ここでユーザーにエラーメッセージを返すなどの処理
}
このパターンは、エラー返却と安全性チェックを一貫して行うことで、バグを未然に防ぎます。特に if err != nil のチェックを忘れないようにすることが、Go初心者にとって重要です。
コメント
コメントを投稿