モジュール 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を使用してください。