الاستدعاءات المحمية باستخدام pcall()
جزء من قسم المنطق والتحكم في التدفق في رحلة Lua على Coddy. الدرس 33 من 54.
بينما تؤدي error() إلى إيقاف برنامجك عند حدوث خطأ ما، قد ترغب أحيانًا في معالجة الأخطاء دون حدوث انهيار. تتيح لك دالة Lua pcall() تنفيذ التعليمات البرمجية التي قد تفشل بأمان.
يرمز الاسم pcall() إلى «استدعاء محمي». فهو يغلّف استدعاء دالة بطبقة وقائية تلتقط أي أخطاء. وبدلًا من أن يتعطل برنامجك، تُرجع pcall() معلومات حول ما حدث.
إليك الصياغة الأساسية:
local status, result = pcall(functionName, arg1, arg2)تعيد الدالة pcall() قيمتين. الأولى هي status من النوع المنطقي: true إذا نجحت الدالة، أو false إذا حدث error. تعتمد القيمة الثانية على status؛ فإذا نجحت، تكون هي قيمة function المعادة؛ وإذا حدث error، تكون هي message الخطأ.
إليك مثالًا عمليًا:
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في هذا المثال، تؤدي القسمة على zero إلى تشغيل error، ولكن بدلاً من التعطل، تلتقط pcall() هذا الخطأ. يستمر البرنامج في العمل ويمكنه التعامل مع error بسلاسة من خلال التحقق من قيمة status.
التحدي
سهلاكتب دالة safeCalculate تأخذ operation وa وb وتُرجع نتيجة الحساب أو رسالة خطأ.
يجب أن تستخدم الدالة pcall() لتنفيذ العملية الرياضية المطلوبة بأمان. أنشئ دالة داخلية تُجري الحساب استنادًا إلى سلسلة العملية، ثم غلّفها باستخدام 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(سلسلة نصية): العملية المطلوب تنفيذها ("add" أو "subtract" أو "multiply" أو "divide")a(عدد): المعامل الأولb(عدد): المعامل الثاني
القيم المُعادة: سلسلة نصية تحتوي إما على "Result: " متبوعة بنتيجة الحساب، أو "Error: " متبوعة برسالة الخطأ (سلسلة نصية)
جرّب بنفسك
function safeCalculate(operation, a, b)
-- اكتب الكود هنا
-- Note: يتوقع مشغّل الاختبار أن تتضمن رسالة الخطأ رقم السطر.
-- تأكد من أن استدعاء الخطأ لديك على السطر المتوقع أو استخدم رسالة خطأ بسيطة إذا سمح مشغّل الاختبار بذلك.
endيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق والتحكم في التدفق
1التكرار المتقدم عبر الجداول
التكرار باستخدام pairs()التكرار باستخدام ipairs()pairs() مقابل ipairs()مراجعة - ورقة الشخصية2المزيد من دوال مكتبة Table
table.concat()إنشاء الجداول و unpack()table.sort()فرز مخصص باستخدام الدوالمراجعة - لوحة أعلى النتائجتدرّب بنفسك: مترجم Lua عبر الإنترنت