الاستدعاءات المحمية باستخدام pcall()
جزء من قسم Logic & Flow في رحلة 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في هذا المثال، تؤدي القسمة على صفر إلى حدوث خطأ، ولكن بدلاً من التعطل، تقوم pcall() بالتقاطه. يستمر البرنامج في العمل ويمكنه التعامل مع الخطأ بسلاسة من خلال التحقق من قيمة الحالة.
التحدي
سهلاكتب دالة 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: "متبوعاً برسالة الخطأ
المعاملات (Parameters):
operation(string): العملية المراد تنفيذها ("add" أو "subtract" أو "multiply" أو "divide")a(number): المعامل الأولb(number): المعامل الثاني
المخرجات (Returns): سلسلة نصية تحتوي إما على "Result: " متبوعاً بنتيجة الحساب، أو "Error: " متبوعاً برسالة الخطأ (string)
ورقة مرجعية
تسمح لك وظيفة pcall() (الاستدعاء المحمي - protected call) بتنفيذ الكود الذي قد يفشل بأمان دون أن يتسبب ذلك في توقف برنامجك بشكل مفاجئ.
الصيغة الأساسية:
local status, result = pcall(functionName, arg1, arg2)تعيد pcall() قيمتين:
- status: تكون
trueإذا نجحت الوظيفة، وfalseفي حال حدوث خطأ. - result: القيمة التي تعيدها الوظيفة في حال النجاح، أو رسالة الخطأ في حال حدوث خطأ.
مثال:
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يؤدي هذا إلى التقاط الخطأ بدلاً من تعطل البرنامج، مما يسمح للبرنامج بالاستمرار ومعالجة الخطأ بشكل سليم.
جرّب بنفسك
function safeCalculate(operation, a, b)
-- اكتب الكود هنا
end
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1التكرار المتقدم عبر الجداول
التكرار باستخدام pairs()التكرار باستخدام ipairs()pairs() مقابل ipairs()مراجعة - ورقة الشخصية2المزيد من دوال مكتبة Table
table.concat()إنشاء الجداول و unpack()table.sort()فرز مخصص باستخدام الدوالمراجعة - لوحة أعلى النتائج