إطلاق استثناء
جزء من قسم Logic & Flow في رحلة PHP على Coddy — الدرس 55 من 68.
أحياناً تحتاج إلى الإشارة إلى حدوث خطأ ما في الكود الخاص بك وإيقاف التنفيذ العادي. تسمح لك الكلمة المفتاحية throw بإنشاء استثناء وطرحه يدوياً، مما يمنحك التحكم في متى ولماذا يجب على برنامجك التعامل مع حالة خطأ.
عندما تقوم بطرح استثناء (exception)، فإنك تنشئ كائن Exception جديداً وتزوده برسالة وصفية حول الخطأ الذي حدث. سيقوم هذا الاستثناء بإيقاف تنفيذ الكود الحالي فوراً والبحث عن كتلة catch لمعالجته.
<?php
function checkAge($age) {
if ($age < 0) {
throw new Exception("Age cannot be negative");
}
echo "Age is valid: " . $age;
}
try {
checkAge(-5);
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
}
?>يتطلب بيان throw استخدام بناء الجملة new Exception()، حيث تقوم بتمرير رسالة نصية تصف المشكلة. يمكن استرداد هذه الرسالة لاحقاً باستخدام طريقة getMessage() في كتلة catch الخاصة بك، مما يسهل فهم الخطأ الذي حدث والاستجابة له بشكل مناسب.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
التحدي
سهلستتلقى مدخلين: رقم يمثل السعر ورقم يمثل نسبة الخصم. سيتم توفير كلا المدخلين كأرقام (قد يكون السعر عشرياً، وستكون نسبة الخصم عدداً صحيحاً بين 0 و 100).
اقرأ كلا المدخلين وأنشئ دالة تسمى calculateFinalPrice تقبل معاملين: السعر ونسبة الخصم. داخل هذه الدالة، تحقق مما إذا كانت نسبة الخصم أكبر من 100 أو أقل من 0. إذا تحقق أي من الشرطين، فقم برمي Exception جديد مع الرسالة "Invalid discount percentage". إذا كان الخصم صالحاً، فاحسب السعر النهائي بعد تطبيق الخصم وأرجعه.
استخدم كتلة try...catch لاستدعاء الدالة مع المدخلات المقدمة. في كتلة try، استدعِ الدالة واطبع "Final price: " متبوعاً بالسعر النهائي المحسوب. في كتلة catch، تعامل مع الاستثناء عن طريق طباعة "Error: " متبوعاً برسالة الاستثناء باستخدام طريقة getMessage().
تنسيق الإدخال:
- السطر الأول: رقم يمثل السعر (مثال:
100أو49.99) - السطر الثاني: عدد صحيح يمثل نسبة الخصم (مثال:
20أو150)
المخرجات المتوقعة:
- إذا كان الخصم صالحاً:
Final price:متبوعاً بالسعر المحسوب بعد الخصم - إذا كان الخصم غير صالح:
Error: Invalid discount percentage
ورقة مرجعية
استخدم الكلمة المفتاحية throw لإنشاء الاستثناءات ورميها يدوياً:
throw new Exception("Error message");عندما يتم رمي استثناء، فإنه يوقف التنفيذ العادي ويبحث عن كتلة catch لمعالجته:
<?php
function checkAge($age) {
if ($age < 0) {
throw new Exception("Age cannot be negative");
}
echo "Age is valid: " . $age;
}
try {
checkAge(-5);
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
}
?>استخدم الأسلوب getMessage() في كتلة catch لاسترداد رسالة الاستثناء.
جرّب بنفسك
<?php
// قراءة المدخلات
$price = floatval(fgets(STDIN));
$discountPercentage = intval(fgets(STDIN));
// TODO: اكتب كودك أدناه
// calculateFinalPrice قم بإنشاء الدالة
// لاستدعاء الدالة ومعالجة الاستثناءات try...catch استخدم كتلة
// طباعة المخرجات المناسبة
?>يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1الدوال المتقدمة
الدوال المجهولةالـ Closures وكلمة 'use'دوال السهمدوال الـ Callbackاستخدام 'call_user_func'دوال المتغيراتالتمرير بالمرجعالدوال العوديةمراجعة: مزيج الدوال4المصفوفات متعددة الأبعاد
إنشاء مصفوفة ثنائية الأبعادالوصول إلى عناصر المصفوفة ثنائية الأبعادتعديل عناصر المصفوفة ثنائية الأبعادالتكرار باستخدام الحلقات المتداخلةالمصفوفات الترابطية ثنائية الأبعادمراجعة: تمرين الشبكة البسيطة2معالجة المصفوفات المتقدمة
الإضافة باستخدام 'array_push'الحذف باستخدام 'array_pop'الإضافة باستخدام 'array_unshift'الحذف باستخدام 'array_shift'دمج المصفوفات المفهرسةدمج المصفوفات الترابطيةالاستخراج باستخدام 'array_slice'القيم باستخدام 'in_array'المفاتيح باستخدام 'array_search'مراجعة: تمرين قائمة التشغيل5سجل درجات الطلاب
إعداد المشروع: هيكل البياناتإضافة طالب جديدإضافة درجة لطالبحساب متوسط الطالبإيجاد الطالب المتفوقإنشاء تقرير الدرجات8معالجة الأخطاء والاستثناءات
فهم أخطاء PHPكتلة 'try...catch'كتلة 'finally'إطلاق استثناءإنشاء استثناء مخصصاستخدام استثناء مخصصمراجعة: التحقق من صحة المدخلات3ترتيب المصفوفات
ترتيب المصفوفات المفهرسة تصاعدياًترتيب المصفوفات المفهرسة تنازلياًترتيب المصفوفات الترابطية حسب القيمةترتيب المصفوفات الترابطية حسب المفتاحالترتيب بالترتيب الطبيعيالترتيب المخصص باستخدام 'usort'مراجعة: ترتيب لوحة المتصدرين