失敗時の後始末にerrdeferを使う
何かが失敗したときだけ処理を取り消します。
「失敗時の後始末に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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- catchで復旧する
- 特定のエラーをswitchで処理する
- 失敗時の後始末にerrdeferを使う
- エラーをラップして再スローする