محتويات الدورة

PHP / متوسط: الكائنات والحفظ والاختبار / الدرس 9

الاستثناءات والتحذيرات وملكية الإخفاق

حدّد طبقة الاكتشاف والتصنيف والاستعادة والعرض. احفظ الأسباب دون ابتلاع عيوب البرمجة أو خلط التشخيص بجسم الاستجابة.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • تمييز إخفاقات Throwable من التحذيرات.
  • استخدام catch محددة وتنظيف finally موثوق.
  • حفظ السياق الآمن ونتائج الخطأ المستقلة.

ليست كل الإخفاقات آلية واحدة

لـPHP استثناءات وكائنات Error تنفذ Throwable وتحذيرات وإشعارات بقواعدها. لا تمسك catch(Exception) تحذير المفتاح تلقائياً، وتنتمي TypeError إلى Error. تستطيع Throwable رصدها لكن لا ينبغي تحويل كل عيب لنتيجة فارغة ناجحة. افصل المتوقع من العيب؛ فقد يغيب اختياري طبيعياً ويخالف السعر السالب ثابتاً داخلياً. يوجه التصنيف الاستعادة لا إسكات العرض.

إضافة السياق دون محو السبب

قد يرمي المستوى الأدنى نوعاً محدداً ويضيف الأعلى سياقاً باستثناء سابق. احفظ السبب للتشخيص الخاص مع رسالة مستخدم آمنة. لا تكرر المكدس في كل طبقة فيضيع التكرار والملكية. تعني عودة catch استعادة؛ فإن لم تجز فأعد الرمي أو ترجم للنوع الموثق. لا تضع رموزاً أو بيانات SQL شخصية أو معرف جلسة برسالة قد تعرض.

php سياق مجال بسبب محفوظ
<?php
declare(strict_types=1);
try {
    try { throw new RuntimeException("storage unavailable"); }
    catch (RuntimeException $cause) { throw new DomainException("course load failed", 0, $cause); }
} catch (DomainException $error) {
    echo $error->getMessage(), PHP_EOL;
    echo get_class($error->getPrevious()), PHP_EOL;
}
الناتج المتوقع
course load failed
RuntimeException

يرى المستدعي فشل المجال ويبقى السابق لتشخيص مضبوط.

تحرر finally العمل المملوك

تعمل finally عند مغادرة التدفق المحمي في الحالات المعتادة سواء نجح أو رمى. أغلق المورد أو أعد الحالة ولا تعِد نتيجة تخفي الخطأ. ليس انهيار العملية بروتوكول تنظيف، فتحتاج الديمومة معاملات واستعادة. يسجل المثال تسلسلاً مضبوطاً بلا مورد خارجي. اختبر النجاح والفشل والاستثناء المناسب، واجمع الاكتساب والتحرير في نطاق صغير حيث يمكن.

php تسلسل تنظيف ظاهر
<?php
declare(strict_types=1);
$events = [];
try {
    $events[] = "start";
    throw new InvalidArgumentException("invalid quantity");
} catch (InvalidArgumentException $error) {
    $events[] = $error->getMessage();
} finally {
    $events[] = "released";
}
echo implode(",", $events), PHP_EOL;
الناتج المتوقع
start,invalid quantity,released

يعالج الفشل المعروف ويحدث التنظيف دون قمع خارج العقد.

إصلاح التحذيرات بدلاً من إخفائها

تكشف التحذيرات افتراض مدخل أو بيئة مكسوراً. افحص الموضع وأول قيمة. قد تخفي @ التشخيص ولا تصلح السبب وليست استراتيجية عامة. يمكن لمعالج مضبوط تحويل تحذيرات مختارة لاستثناءات، لكن حد نطاقه وأعده ولا تفترض إمساك كل خطأ قاتل. افصل عرض الإنتاج من التسجيل الخاص ولا تجعل التفاصيل العامة إصلاحاً دائماً.

عرض استجابة إخفاق متماسكة واحدة

صنف الخطأ عند HTTP واختر الحالة والجسم الآمن وأرسل مرة قبل البايتات. ليس استثناء القاعدة مخطط مستخدم ولا يصير التحقق نجاحاً لأن JSON تولد. احفظ معرف ربط عند وجوده دون أسرار. وحدد سياسة خروج وقناة تشخيص في CLI. اختبر الفشل وضابطاً سليماً كيلا يجعل تعطل الاعتماد كل سلبي صحيحاً. أظهر الرفض وغياب الأثر الممنوع.

الأخطاء الشائعة وإصلاحها

تحويل كل Throwable لمصفوفة فارغة

لماذا يحدث؟
معاملة العيوب كغياب ناجح.
كيف تصلحه؟
معالجة المتوقع تحديداً وتمرير غير المفسر.
كيف تتجنب تكراره؟
توثيق دلالة الفشل واختبارها.

افتراض إمساك Exception للتحذير

لماذا يحدث؟
خلط آليات الخطأ.
كيف تصلحه؟
إصلاح الحد أو معالج مقصود محدود.
كيف تتجنب تكراره؟
اختبار الآلية والنوع فعلياً بالإصدار.

إخفاء finally للخطأ الأصلي

لماذا يحدث؟
إرجاع أو رمي نتيجة بديلة أثناء التنظيف.
كيف تصلحه؟
تبسيط التنظيف وحفظ الفشل الأساسي.
كيف تتجنب تكراره؟
مراجعة مخارج النجاح والفشل معاً.

اختبر فهمك

1. هل تمسك catch(Exception $e) النوع TypeError؟

اعرض الحل المشروح

لا؛ هي Error تنفذ Throwable لا فرع Exception. قد تمسكها الحدود العليا للتقرير الآمن لكن الاستعادة محددة. افحص النوع ولا تحول العيب لسجل فارغ صالح.

2. ماذا يفحص بعد حجز مرفوض؟

اعرض الحل المشروح

افحص فئة الخطأ وعدم تغير المقعد والدفع والسجل. لا تثبت الرسالة وحدها الذرية. أضف نجاحاً مسموحاً وفشلاً مضبوطاً بعد عمل جزئي إن لزم التراجع.

أهم ما تعلمته

  • للاكتشاف والاستعادة والتنظيف والعرض ملاك مختلفون.
  • احفظ الأسباب وأصلح الافتراض لا العرض فقط.

المراجع الرسمية