Zig Academy · レッスン

失敗時の後始末にerrdeferを使う

何かが失敗したときだけ処理を取り消します。

レッスン 3/413 ステップ

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

失敗時だけクリーンアップする

操作が失敗した場合は作業を元に戻し、成功した場合はそのままにしたいことがあります。このような場合に使うのが errdefer です。

errdefer を使う

errdefer はスコープを抜けるときに実行するコードを登録します。ただし、その時点以降に関数がエラーを返した場合にだけ実行されます。

errdefer allocator.free(buffer);

defer は常に、errdefer はエラー時に

defer はスコープがどのように終了しても実行されます。errdefer はエラー経路でのみ実行されるため、成功時には完全にスキップされます。

作成途中の結果を解放する

まず確保し、その直後に errdefer で解放を登録します。後続の処理が失敗すればバッファーは解放され、すべて成功すれば保持して返せます。

const buf = try allocator.alloc(u8, n);
errdefer allocator.free(buf);
try fill(buf);

順序は確保の順序を反映する

各 errdefer は、対応するリソースの確保直後に置きます。失敗時には逆順で実行されるため、安全な順序でリソースが巻き戻されます。

const a = try open();
errdefer a.close();
const b = try open();
errdefer b.close();

成功時は作業結果を保持する

関数がエラーではなく値を返す場合、すべての errdefer はスキップされます。呼び出し側は完全に構築された結果を受け取ります。

return buf;

登録するタイミングが重要

errdefer が保護するのは、登録後に発生したエラーだけです。その行より前のエラーでは実行されないため、早めに配置してください。

エラーをキャプチャする

errdefer でエラーをキャプチャし、クリーンアップ中に調べることができます。たとえば、どの失敗がロールバックを引き起こしたかをログに記録できます。

errdefer |e| std.debug.print("failed: {}\n", .{e});

リークのないコンストラクターを構築する

リソースを確保した後に失敗する可能性がある関数では、errdefer を使ってリークを防ぎます。途中までの作業は、エラー時に自動的に元に戻されます。

try と組み合わせる

各 try は、エラー時に早期終了する可能性があります。errdefer が登録されていれば、その早期終了時にも、巻き戻しの前にクリーンアップが実行されます。

const x = try step();
errdefer rollback(x);
_ = try next(x);

ロールバックに適したツール

問題が発生した場合にだけクリーンアップしたいときは、errdefer を使います。エラー経路でのリソース管理を、明確な 1 行にまとめられます。

クイックチェック

バッファーを確保した後、後続の処理が失敗する可能性があるとします。失敗時だけ解放したい場合、何を使うでしょうか。

まとめ

errdefer を使ってエラー経路で途中までの作業を元に戻し、各確保の直後に配置し、成功した結果をそのまま保持しました。✅

無料で開始

AI チューターと学ぶ Zig — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
30
レッスン
120

よくある質問

「失敗時の後始末にerrdeferを使う」レッスンは無料ですか?

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

「失敗時の後始末にerrdeferを使う」で何を学びますか?

何かが失敗したときだけ処理を取り消します。 ブラウザで直接実行するハンズオンコードでZig Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「失敗時の後始末にerrdeferを使う」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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