الاستدعاءات المحمية باستخدام 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(). يستمر البرنامج في العمل ويمكنه التعامل مع الخطأ بسلاسة من خلال التحقق من قيمة الحالة.
التحدي
سهلاكتب دالة 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)
-- اكتب الكود هنا
-- Note: استدعِ error(message, 0) حتى لا يضيف Lua اسم الملف و
-- رقم السطر أمام رسالتك.
endيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق والتحكم في التدفق
1التكرار المتقدم عبر الجداول
التكرار باستخدام pairs()التكرار باستخدام ipairs()pairs() مقابل ipairs()مراجعة - ورقة الشخصية2المزيد من دوال مكتبة Table
table.concat()إنشاء الجداول و unpack()table.sort()فرز مخصص باستخدام الدوالمراجعة - لوحة أعلى النتائجتدرّب بنفسك: مترجم Lua عبر الإنترنت