Zig Academy · درس

‏errdefer لتنظيف ما بعد الفشل

تراجعوا عن العمل فقط عند حدوث فشل

الدرس 3 من 413 خطوة

‏errdefer لتنظيف ما بعد الفشل درس مجاني في Zig Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في 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 عندما ينبغي أن يحدث التنظيف فقط إذا ساءت الأمور. فهو يحول إدارة الموارد في مسار الخطأ إلى سطر واحد واضح.

تحقق سريع

خصصتم مخزنًا مؤقتًا، وقد تفشل خطوة لاحقة. وتريدون تحريره عند الفشل فقط. ماذا تستخدمون؟

مراجعة

استخدمتم errdefer للتراجع عن العمل الجزئي في مسار الخطأ، ووضعتموه مباشرةً بعد كل اكتساب، وحافظتم على النتائج الناجحة. ✅

البدء مجانًا

تعلم Zig مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
30
الدروس
120

الأسئلة الشائعة

هل درس «‏errdefer لتنظيف ما بعد الفشل» مجاني؟

نعم — نص درس «‏errdefer لتنظيف ما بعد الفشل» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Zig Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Zig Academy 4 دروس في المجموع.

ماذا ستتعلم في «‏errdefer لتنظيف ما بعد الفشل»؟

تراجعوا عن العمل فقط عند حدوث فشل تتمرن على Zig Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Zig Academy؟

لا تُشترط خبرة سابقة. Zig Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «‏errdefer لتنظيف ما بعد الفشل»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Zig Academy هذا؟

نعم. كل درس في Zig Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. التعافي باستخدام catch
  2. التبديل على أخطاء محددة
  3. ‏errdefer لتنظيف ما بعد الفشل
  4. لف الأخطاء وإعادة طرحها
← العودة إلى Zig Academy