0Pricing
Zig Academy · レッスン

エラーをラップして再スローする

エラーが上位へ伝わる過程でコンテキストを追加します。

「エラーをラップして再スローする」はCoddyKit上の無料Zig Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはZig Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Zig Academyコースには全4レッスンが含まれています。

エラーは上位へ伝わる

関数自身で失敗を処理できない場合、そのエラーを呼び出し側へ渡します。その途中でエラーを変更したり、再スローしたりできます。

try で再スローする

最も単純な再スローは try です。元のエラーを変更せずに呼び出し側へ転送するため、同じ値が上位へ伝わり続けます。

const data = try readFile(path);

catch してから返す

エラーを変換するには、catch して別のエラーを返します。低レベルのエラーを、独自の API に適したエラーに置き換えられます。

const f = open(path) catch return error.ConfigMissing;

switch でエラーをマッピングする

catch と switch を組み合わせると、基になった各エラーをより明確なエラーに変換し、それ以外は変更せずに通過させられます。

parse(s) catch |e| switch (e) {
    error.Empty => return error.NoInput,
    else => return e,
};

Zig では値としてスタックトレースを持たない

Zig のエラーはコンテキストを保持するオブジェクトではなく、単なるタグです。詳細を追加するには、より説明的な独自のエラーを再スローします。

コンテキストは別途付加する

エラータグにはメッセージが含まれないため、失敗が発生した場所で詳細をログに記録し、その後、より上位のエラーを呼び出し側に返します。

open(path) catch |e| {
    std.log.err("open {s}: {}", .{ path, e });
    return error.LoadFailed;
};

エラーセットを広げる

新しいエラーを返す場合、関数のエラーセットにそのエラーを含める必要があります。推論される !T のセットは、返すすべてのエラーを含むように拡張されます。

fn load() !Config {
    return open(".cfg") catch error.LoadFailed;
}

保持するか置き換えるか

層ごとに判断します。try で正確なエラーを転送するか、呼び出し側にとってより意味のあるエラーに置き換えます。どちらも正しい方法です。

境界をすっきり保つ

モジュールの境界では、内部エラーを小さな公開セットに変換します。呼び出し側は内部実装ではなく、安定した名前に依存できます。

errdefer と組み合わせる

再スローするときも、スコープ内の errdefer は先に実行されます。そのため、1 つの経路でリソースをロールバックし、エラーを変換できます。

意味のある失敗

エラーをラップすると、生の原因をドメインに適したメッセージに変換できます。呼び出し側には内部の詳細ではなく、明確なエラーが見えます。

クイックチェック

低レベルの error.NotFound を、呼び出し側向けの独自の error.ConfigMissing に置き換えたいとします。どの方法が機能するでしょうか。

まとめ

try でエラーを再スローし、catch と switch でマッピングし、コンテキストをログに記録し、エラーセットを広げて失敗を意味のあるものに保ちました。✅

よくある質問

「エラーをラップして再スローする」レッスンは無料ですか?

はい。「エラーをラップして再スローする」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Zig Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Zig Academyコースには全4レッスンが含まれています。

「エラーをラップして再スローする」で何を学びますか?

エラーが上位へ伝わる過程でコンテキストを追加します。 ブラウザで直接実行するハンズオンコードでZig Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Zig Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのZig Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「エラーをラップして再スローする」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このZig Academyレッスンでコードを書いて実行できますか?

はい。すべてのZig Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. catchで復旧する
  2. 特定のエラーをswitchで処理する
  3. 失敗時の後始末にerrdeferを使う
  4. エラーをラップして再スローする
← Zig Academyに戻る