コース一覧
    Go基礎:制御構文
    エラーを作る

    Go基礎:制御構文

    Goの分岐、反復、関数、エラー処理を体系的に学ぶ基礎コースです。

    1
    制御構文(forしかない世界)
    01. Goのif15分
    02. forしかない世界15分
    03. forの七変化15分
    04. Goのswitch15分
    05. 定番: FizzBuzz15分
    06. ループで集計15分
    07. つくる: 商品集計20分
    08. 第3章クイズ10分
    2
    関数とエラー処理
    01. funcで関数を作る15分
    02. 複数戻り値(Goならでは)15分
    03. if err != nil(Goの心臓)15分
    04. エラーを作る15分
    05. deferで後始末15分
    06. つくる: 検証つき関数群20分
    07. 第4章クイズ10分

    エラーを作る

    errors.New で作る

    Go

    import "errors"
    
    return errors.New("価格が0以下です")

    渡した文字列が、そのエラーの理由になります。取り出すときは Error() を呼びます。

    Go

    err := errors.New("価格が0以下です")
    fmt.Println(err.Error())   // 価格が0以下です

    fmt.Println(err) と書いても同じ文字が出ます。%v で埋め込むこともできます。

    fmt.Errorf で値を混ぜる

    理由に具体的な値を入れたいときは fmt.Errorf です。

    Go

    return fmt.Errorf("価格 %d は上限 %d を超えています", price, max)

    プレーンテキスト

    価格 2000000 は上限 1000000 を超えています

    Sprintf と同じ型紙が使えます。違いは、文字列ではなく error を作ることだけです。

    実際の開発では、こちらのほうが圧倒的に役に立ちます。「価格が上限を超えています」だけでは、いくらだったのか分からず調査に困ります。

    エラー文の書き方

    Go には慣習があります。

    プレーンテキスト

    小文字で始める      句点で終わらない
    
    errors.New("価格が0以下です")      日本語ならこれで問題ない
    errors.New("invalid price")       英語なら小文字始まり
    errors.New("Invalid price.")      英語では避ける形

    理由は、エラーが他のエラーの中に埋め込まれることがあるからです。

    プレーンテキスト

    failed to create item: invalid price

    途中に大文字や句点が混ざると、文としておかしくなります。日本語で書く場合はあまり気にしなくて済みますが、そういう習慣がある言語だと知っておくと、標準ライブラリのエラー文が読みやすくなります。

    定義済みのエラーを持つ

    同じエラーを何度も返す場合は、変数にしておく書き方もあります。

    Go

    var ErrNotFound = errors.New("商品が見つかりません")
    
    func findItem(id int) (int, error) {
    	return 0, ErrNotFound
    }

    呼び出し側で「このエラーかどうか」を比べられるようになります。

    Go

    if err == ErrNotFound {
    	return "見つかりませんでした"
    }

    文字列で比べると、文言を直した瞬間に壊れます。変数で比べるのが定石です。第8章で 404 を返す判断をするときに、この形が出てきます。

    要件

    1. 商品名が空なら 商品名が空です を返す
    2. 価格が0以下なら 価格が0以下です を返す
    3. 価格が1000000より大きいなら 価格 N は上限を超えています を返す(N は実際の価格)
    4. 問題が無ければ 商品名 を登録しました を返す
    5. 判定は上の順番で行い、最初に見つかった問題を返す

    ヒント

    3つ目だけ `fmt.Errorf("価格 %d は上限を超えています", price)` を使います。値を文に混ぜられるのが `Errorf` です

    `registerItem` では `err.Error()` でエラーの文字列を取り出して返します

    判定の順番が問われます。名前が空で価格も不正なときは、先に書いた名前のエラーが返ります

    生田 陸人
    監修生田 陸人
    ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
    編集 ゆめさく編集部·公開 2026/08/10

    関連レッスン

    • deferで後始末

      関数の終わりに実行する処理を予約し、開始と終了のログを対で出せるようになります。

    • つくる: 検証つき関数群

      第4章の知識で出品の検証と計算をerror付きの関数にまとめられるようになります。

    • 第4章クイズ

      関数、複数戻り値、error、defer についての理解を確認します。

    このレッスンに出てくる用語

    意味があいまいなまま進んだ語は、ここから読み直せます。

    • 標準ライブラリPythonに同梱の公式モジュール群
    • 変数データに名前をつけて参照する仕組み
    • 判断YES/NO 分岐を表す菱形
    main.go
    エディタを読み込んでいます

    メモ

    エラーを作る

    ⌘S で保存