الاستدعاءات المحمية باستخدام pcall()
جزء من قسم المنطق والتحكم في التدفق في رحلة Lua على Coddy — الدرس 33 من 54.
بينما تعمل error() على إيقاف برنامجك عندما يحدث خطأ ما، قد ترغب في بعض الأحيان في التعامل مع الأخطاء دون أن ينهار البرنامج. تتيح لك دالة pcall() في Lua تنفيذ البرامج النصية بأمان والتي قد تفشل.
الاسم pcall() يعني "Protected Call" (استدعاء محمي). يقوم بتغليف استدعاء الدالة بلاحظة حماية تلتقط أي أخطاء. بدلاً من انهيار برنامجك، يعيد pcall() معلومات حول ما حدث.
إليك بناء الجملة الأساسي:
local status, result = pcall(functionName, arg1, arg2)ترجع الدالة pcall() قيمتين. الأولى هي حالة منطقية (boolean): true إذا نجحت الدالة، أو false إذا حدث خطأ. تعتمد القيمة الثانية على الحالة—إذا كانت ناجحة، فهي قيمة الإرجاع للدالة؛ وإذا كان هناك خطأ، فهي رسالة الخطأ.
إليك مثالاً عملياً:
function divide(a, b)
if b == 0 then
error("Cannot divide by zero")
end
return a / b
end
local success, result = pcall(divide, 10, 0)
if success then
print("Result: " .. result)
else
print("Error caught: " .. result)
endفي هذا المثال، يتسبب القسمة على صفر في حدوث خطأ (error)، ولكن بدلاً من التحطم، يقوم pcall() بالتقاطه. يستمر البرنامج في التشغيل ويمكنه التعامل مع الخطأ بسلاسة عن طريق التحقق من قيمة الحالة (status).
التحدي
سهلاكتب دالة safeCalculate تأخذ operation و a و b وتُرجع نتيجة الحساب أو رسالة خطأ.
يجب أن تستخدم الدالة pcall() لتنفيذ العملية الحسابية المطلوبة بأمان. أنشئ دالة داخلية تقوم بالحساب بناءً على سلسلة العملية الحسابية (operation string)، ثم غلّفها بـ pcall() للالتقاط أي أخطاء.
المنطق:
- أنشئ دالة داخلية تتحقق من نوع العملية الحسابية وتنفذ الحساب
- بالنسبة لـ "add"، أرجع
a + b - بالنسبة لـ "subtract"، أرجع
a - b - بالنسبة لـ "multiply"، أرجع
a * b - بالنسبة لـ "divide"، تحقق مما إذا كانت قيمة
bهي 0 واستدعِerror("Division by zero")إذا كان ذلك صحيحاً، وإلا أرجعa / b - لأي عملية أخرى، استدعِ
error("Invalid operation") - استخدم
pcall()لتنفيذ الدالة الداخلية - في حالة النجاح، أرجع
"Result: "متبوعة بالنتيجة - في حالة حدوث خطأ، أرجع
"Error: "متبوعة برسالة الخطأ
المعاملات:
operation(string): العملية المراد تنفيذها ("add" أو "subtract" أو "multiply" أو "divide")a(number): المعامل الأولb(number): المعامل الثاني
القيمة المرجعة: سلسلة نصية تحتوي إما على "Result: " متبوعة بنتيجة الحساب، أو "Error: " متبوعة برسالة الخطأ (string)
جرّب بنفسك
function safeCalculate(operation, a, b)
-- اكتب الكود هنا
-- Note: يتوقع مشغّل الاختبار أن تتضمن رسالة الخطأ رقم السطر.
-- تأكد من أن استدعاء الخطأ موجود على السطر المتوقع أو استخدم رسالة خطأ بسيطة إذا سمح مشغّل الاختبار بذلك.
endيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق والتحكم في التدفق
1التكرار المتقدم عبر الجداول
التكرار باستخدام pairs()التكرار باستخدام ipairs()pairs() مقابل ipairs()مراجعة - ورقة الشخصية2المزيد من دوال مكتبة Table
table.concat()إنشاء الجداول و unpack()table.sort()فرز مخصص باستخدام الدوالمراجعة - لوحة أعلى النتائج