スキップしてメイン コンテンツに移動

Go初心者必見!エラー処理の極意

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.Newfmt.Errorf です。errors.New は単純な文字列をエラーに変換するだけで、フォーマットは行いません。

err := errors.New("ファイルが見つかりません")

一方、fmt.Errorffmt.Sprintf と同様にフォーマット文字列を受け取り、動的にメッセージを生成できます。エラーにコンテキストを付与したい場合に便利です。

err := fmt.Errorf("ファイル %s を読み込めません: %w", path, err)

ここで %w を使うと、元のエラーをラップして errors.Iserrors.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初心者にとって重要です。

この記事はAIによって作成されました。

コメント