モジュールのレッスン (5/5)
エラー: `if err != nil` パターン
Go では、エラーは例外ではなく 値 です。できる機能 失敗はエラーを最後の値として返し、呼び出し元はそれをチェックします 明示的に。明示的で、予測可能で、テストが簡単です。その代償は次のとおりです。 もう少し冗長に。
error インターフェース
error は、言語に組み込まれた小さなインターフェイスです。
type error interface {
Error() string
}Error() string を実装する型はすべて error です。
基本的なパターン
v, err := operazione()
if err != nil {
// gestisci o propaga
return err
}
// usa vこれは何千回も目にするでしょう。これはあらゆるものの慣用的なコードです。 間違いやすい呼び出し。繰り返しについて罪悪感を感じないでください。それは特徴であって、特徴ではありません。 バグです。
ビルド エラー: errors.New および fmt.Errorf
import (
"errors"
"fmt"
)
err1 := errors.New("file mancante")
err2 := fmt.Errorf("apertura %q fallita: permesso negato", path)fmt.Errorf は、メッセージに変数を含めたい場合に最適です。
%w によるラッピング
元のコンテキストを失わずにコンテキストを追加してエラーを伝播するには:
f, err := os.Open(path)
if err != nil {
return fmt.Errorf("config: %w", err)
}%w 元のエラーを「ラップ」し、後で回復可能
errors.Is (センチネルの場合は同等) または errors.As (具体的なタイプの場合):
if errors.Is(err, os.ErrNotExist) {
// file inesistente, gestione speciale
}センチネルエラー
これらは変数としてエクスポートされたエラーで、errors.Is との比較に使用されます。
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 パターンの。
試してみてください
strconv.Atoi からのエラーを処理します。err != nil の場合は、それを出力して戻ります。それ以外の場合は n を出力します。
ヒントを表示
標準的なパターン: `err != nil` をチェックし、ログ/リターンしてから `n` を使用します。
3 回の試行後に解決策が利用可能になります
safeDiv を実装します。 b == 0 の場合、0 とエラーが返されます。New('divisione per zero');それ以外の場合は a/b および nil です。
ヒントを表示
実行時のパニックを避けるために、除算の前に `b == 0` をチェックしてください。
3 回の試行後に解決策が利用可能になります
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は回復不可能なエラーの場合のみであり、通常の制御フローの場合は対象外です。