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