メインコンテンツにスキップ
モジュール 2 · レッスン 5 / 5コース内の 10/50~12 min
モジュールのレッスン (5/5)

エラー: `if err != nil` パターン

Go では、エラーは例外ではなく 値 です。できる機能 失敗はエラーを最後の値として返し、呼び出し元はそれをチェックします 明示的に。明示的で、予測可能で、テストが簡単です。その代償は次のとおりです。 もう少し冗長に。

error インターフェース

error は、言語に組み込まれた小さなインターフェイスです。

Go
type error interface {
    Error() string
}

Error() string を実装する型はすべて error です。

基本的なパターン

Go
v, err := operazione()
if err != nil {
    // gestisci o propaga
    return err
}
// usa v

これは何千回も目にするでしょう。これはあらゆるものの慣用的なコードです。 間違いやすい呼び出し。繰り返しについて罪悪感を感じないでください。それは特徴であって、特徴ではありません。 バグです。

ビルド エラー: errors.New および fmt.Errorf

Go
import (
    "errors"
    "fmt"
)

err1 := errors.New("file mancante")
err2 := fmt.Errorf("apertura %q fallita: permesso negato", path)

fmt.Errorf は、メッセージに変数を含めたい場合に最適です。

%w によるラッピング

元のコンテキストを失わずにコンテキストを追加してエラーを伝播するには:

Go
f, err := os.Open(path)
if err != nil {
    return fmt.Errorf("config: %w", err)
}

%w 元のエラーを「ラップ」し、後で回復可能 errors.Is (センチネルの場合は同等) または errors.As (具体的なタイプの場合):

Go
if errors.Is(err, os.ErrNotExist) {
    // file inesistente, gestione speciale
}

センチネルエラー

これらは変数としてエクスポートされたエラーで、errors.Is との比較に使用されます。

Go
var ErrNotFound = errors.New("non trovato")

func find(id int) (Item, error) {
    // ...
    return Item{}, ErrNotFound
}

// chiamante:
if errors.Is(err, ErrNotFound) { ... }

panic および recover (プレビュー)

panic は Go に存在しますが、回復不可能 エラー (例: バグ、 違反した不変条件)、通常の制御フローではありません。さらに深く進んでいきます defer/recover を備えた関数モジュール。現時点では: そのままでは使用しないでください if err != nil パターンの。

試してみてください

運動#go.m2.l5.e1
試行回数: 0読み込み中…

strconv.Atoi からのエラーを処理します。err != nil の場合は、それを出力して戻ります。それ以外の場合は n を出力します。

エディターを読み込み中…
ヒントを表示

標準的なパターン: `err != nil` をチェックし、ログ/リターンしてから `n` を使用します。

3 回の試行後に解決策が利用可能になります

運動#go.m2.l5.e2
試行回数: 0読み込み中…

safeDiv を実装します。 b == 0 の場合、0 とエラーが返されます。New('divisione per zero');それ以外の場合は a/b および nil です。

エディターを読み込み中…
ヒントを表示

実行時のパニックを避けるために、除算の前に `b == 0` をチェックしてください。

3 回の試行後に解決策が利用可能になります

Quiz#go.m2.l5.e3
準備完了

Go でエラーを処理するための慣用的なパターンはどれですか?

Go
v, err := f()
// poi?
回答の選択肢

要約

  • error は、1 つのメソッド Error() string とのインターフェイスです。
  • 正規パターン: v, err := f(); if err != nil { return err }。
  • errors.New(msg) または fmt.Errorf("ctx: %w", err) によるビルド エラー。
  • ラッピングには %w を使用し、チェーンの検査には errors.Is / errors.As を使用します。
  • panic は回復不可能なエラーの場合のみであり、通常の制御フローの場合は対象外です。