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

エラーインターフェイス

Go の error はキーワードではありません。これは 組み込みインターフェイス です。 単一のメソッド。

Go
type error interface {
    Error() string
}

Error() string を持つものはすべて error です。と組み合わせると、 関数から (T, error) を返す規則です。 Go におけるエラー処理の基礎。

センチネルエラー

Go
import "errors"

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

func find(key string) (string, error) {
    // ...
    return "", ErrNotFound
}

センチネル は、呼び出し元がエクスポートできる error 値です。 特定のエラーケースを認識するために比較します。

カスタム エラー (データあり)

コンテキスト (欠落しているキーなど) を伝えるには、タイプを定義します。

Go
type ErrNotFound struct {
    Key string
}

func (e *ErrNotFound) Error() string {
    return "non trovato: " + e.Key
}

func find(key string) (string, error) {
    return "", &ErrNotFound{Key: key}
}

errors.Is とerrors.As (Go 1.13+)

== との比較は、「純粋な」センチネルに対してのみ機能します。堅牢であるために ラップされたエラーに対しては、errors パッケージを使用します。

Go
import "errors"

if errors.Is(err, ErrNotFound) {
    // err IS ErrNotFound (even if wrapped)
}

var nfe *ErrNotFound
if errors.As(err, &nfe) {
    // err IS (or wraps) an *ErrNotFound; nfe points to the concrete value
    fmt.Println("chiave mancante:", nfe.Key)
}
  • errors.Is(err, target): ターゲットがラッピング チェーンのどこかにある場合は true。
  • errors.As(err, &target): そのタイプのチェーン内の最初のエラーをターゲットに割り当てます。

%w で折り返します

Go
if err := find("k"); err != nil {
    return fmt.Errorf("operazione X: %w", err)
}

%w (%s や %v ではありません) は、ラップする新しいエラーを作成します。 オリジナルのまま、errors.Is/As によってチェーンをナビゲートできるようにします。

取扱いパターン

Go
v, err := op()
if err != nil {
    return fmt.Errorf("op fallita per %q: %w", id, err)
}

イディオム:

  • err != nil 直ちにを確認してください。「早期のハッピー パス」はありません。
  • fmt.Errorf("... : %w", err) を使用して各レベルにコンテキストを追加します。
  • 「上流」(メイン/ハンドラー付近)、errors.Is/As で区別します。

試してみてください

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

*ErrNotFound に Error() 文字列を実装して、「non trovato: <Key>」を返すようにします。

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

`fmt.Println(err)` は、構造体の Error() メソッドを自動的に呼び出します。

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

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

errors.Is を使用して、err がセンチネル ErrVuoto と等しいかどうかを確認します。

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

`errors.Is(err, target)` は、チェーンをラッピングしても堅牢です。

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

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

エラーを実装するメソッドの正確なシグネチャは何ですか?

Go
func (e *MyErr) ??? {}
回答の選択肢

要約

  • error = interface { Error() string }、組み込み。
  • コンテキストのない既知のケースに対する errors.New("...") のセンチネル。
  • コンテキストを伝えるフィールドを備えたカスタム エラー タイプ。
  • errors.Is(err, target): ラッピングに対して堅牢な比較。
  • errors.As(err, &target): 具体的なタイプの抽出。
  • fmt.Errorf("...: %w", err): チェーンを保持するラッピング。
  • %v / %s をラップしないでください。常に %w を使用してください。