0Pricing
Lua Academy · درس

إدارة الحالة ومعالجة الأخطاء

استخدم lua_pcall للاستدعاءات المحمية وعالج الأخطاء في طبقة C

إدارة الحالة ومعالجة الأخطاء درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.

حالات Lua متعددة

يمكنكم تشغيل عدة مثيلات من lua_State في العملية نفسها. كل مثيل مستقل تمامًا: متغيرات عامة منفصلة، ومكدسات منفصلة، ولا توجد ذاكرة مشتركة افتراضيًا.

حالات الخيوط

تنشئ lua_newthread(L) خيطًا فرعيًا (coroutine) يشارك البيئة العامة نفسها، مع امتلاكه مكدسه الخاص. وهذه هي الطريقة التي تُنفّذ بها coroutines في Lua من C.

مشاركة البيانات بين الحالات

لا يمكن تمرير البيانات مباشرة بين حالات Lua المستقلة. حوّلوا البيانات إلى سلاسل نصية، أو استخدموا هياكل ذاكرة مشتركة في جانب C يمكن الوصول إليها عبر userdata.

الاستدعاءات المحمية مقابل الاستدعاءات الخام

يلتقط lua_pcall الأخطاء (ويستخدم setjmp/longjmp داخليًا). أما lua_call فيمرر الأخطاء وينهي البرنامج. استخدموا lua_pcall دائمًا في بيئة الإنتاج.

// Safe:
if (lua_pcall(L, nargs, nresults, 0) != LUA_OK) {
  const char *err = lua_tostring(L, -1);
  lua_pop(L, 1);
  // handle error
}

كائنات الأخطاء

يمكن أن تكون الأخطاء في Lua أي قيمة، وليس السلاسل النصية فقط. فالتعبير error({code=404, msg="not found"}) يدفع جدولًا باعتباره الخطأ. وتقرأه شيفرة C من المكدس عند فشل pcall.

معالج الهلع

إذا أفلت خطأ من pcall (مثلًا من دالة C استُدعيت دون حماية)، تستدعي Lua معالج الهلع الذي عُيّن عبر lua_atpanic(L, fn) قبل الإنهاء.

// C code
lua_atpanic(L, function(lua_State *L) {
  fprintf(stderr, "PANIC: %s\n", lua_tostring(L, -1));
  exit(1);
  return 0;
});

استعادة المكدس عند الخطأ

بعد حدوث خطأ في lua_pcall، يُستعاد المكدس إلى حالته قبل الاستدعاء (مع إزالة الدالة والوسائط، وإضافة كائن الخطأ في أعلاه).

تنظيف الحالة

أغلقوا الحالة دائمًا باستخدام lua_close(L) عند الانتهاء. فهذا يؤدي إلى تشغيل جميع أدوات إنهاء __gc وتحرير كل الذاكرة المخصصة.

أمان الخيوط

حالة Lua ليست آمنة للاستخدام مع الخيوط. لا تستدعوا دالتي C API على الحالة نفسها بالتزامن مطلقًا. استخدموا حالة واحدة لكل خيط من خيوط نظام التشغيل، أو استخدموا mutex لتسلسل الوصول.

مخصّص الذاكرة

تستخدم Lua افتراضيًا realloc. وفّروا مخصّصًا مخصّصًا باستخدام lua_newstate(allocFn, ud) لتتبّع الذاكرة أو فرض حدود عليها أو استخدام مجمّعات مخصّصة.

العزل باستخدام حالات متعددة

شغّلوا الشيفرة غير الموثوقة في حالة Lua جديدة ومعزولة، دون فتح المكتبات القياسية. ويظل أي تعطل أو استنفاد للموارد محصورًا في تلك الحالة.

سؤال حول معالجة الأخطاء

ما الفرق بين lua_call وlua_pcall؟

مراجعة: إدارة الحالة والأخطاء

استخدموا lua_pcall (وليس lua_call مطلقًا) في بيئة الإنتاج. عيّنوا معالج هلع للتعافي كحل أخير. حافظوا على حالة واحدة لكل خيط. واستخدموا حالات متعددة معزولة للعزل. واستدعوا lua_close دائمًا لإجراء التنظيف.

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

هل درس «إدارة الحالة ومعالجة الأخطاء» مجاني؟

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

ماذا ستتعلم في «إدارة الحالة ومعالجة الأخطاء»؟

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

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

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

كم من الوقت يستغرق درس «إدارة الحالة ومعالجة الأخطاء»؟

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

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

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

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

  1. نموذج مكدس Lua C API
  2. استدعاء دوال Lua من C
  3. تسجيل دوال C في Lua
  4. إدارة الحالة ومعالجة الأخطاء
← العودة إلى Lua Academy