الأخطاء في PHP
مقدمة
لا مفرّ من الوقوع في الأخطاء مهما كنّا حريصين في كتابة الشيفرة. تبلغ PHP عن الأخطاء والتحذيرات والملاحظات التي تحدث بسبب المشاكل الحاصلة في وقت التشغيل، وتصبح عملية تنقيح الأخطاء (Debugging) أكثر سهولة عند معرفة كيفية الكشف عن هذه الأخطاء والتعامل معها.
الأساسيات
تبلّغ PHP عن الأخطاء الناجمة عن عدد من الأخطاء الداخلية، ويمكن الاستفادة من ذلك في الكشف عن عدد من الحالات المختلفة ويمكن عرضها و/أو تسجيلها حسب الحاجة.
تقسم الأخطاء في PHP إلى أنواع مختلفة، وهناك قائمة بهذه الأنواع مع وصف قصير لسلوكها وطريقة حدوثها.
التعامل مع الأخطاء في PHP
تتعامل PHP مع الأخطاء بالاعتماد على الإعدادات الخاصّة باللغة في حال عدم تعيين متحكّمٍ في الأخطاء. ويمكن التحكّم في الأخطاء التي تبلّغ عنها اللغة أو التي تتجاهلها عن طريق موجّه error_reporting
في الملف php.ini، أو في وقت التشغيل عن طريق استدعاء الدالة error_reporting()
. ينصح بشدّة استخدام الموجّه في ملف الإعدادات؛ لأنّ بعض الأخطاء قد تحدث قبل البدء بتنفيذ الشيفرة.
يجب تعيين قيمة الموجّه error_reporting
في بيئة التطوير إلى E_ALL
لأنّك بحاجة إلى معرفة جميع الأخطاء الممكن وقوعها وعلاج أسبابها. أما في بيئة الإنتاج، فيستحسن تعيين قيمة أقل شمولية مثل E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
، ولكن في كثير من الحالات تكون القيمة E_ALL
ملائمة إذ يمكن أن تساعد في الكشف المبكّر عن المشاكل المحتملة.
تعتمد طريقة تعامل PHP مع هذه الأخطاء على موجّهين آخرين في ملف php.ini. يتحكّم الموجّه display_errors
فيما إذا كان الخطأ سيظهر كجزء من مخرجات الشيفرة. يجب تعطيل هذا الخيار دائمًا في بيئة الإنتاج؛ لاحتمال أن تتضمن الأخطاء معلومات سرية مثل كلمات المرور، ولكن تفعيل هذا الخيار مفيد غالبًا في بيئة التطوير، إذ إنه يضمن التبليغ المباشر عن الأخطاء والمشاكل.
يمكن للغة -إضافة إلى عرض الأخطاء- تسجيلها (log) أيضًا وذلك عند تفعيل الموجّه log_errors
، وعندها تسجّل اللغة جميع الأخطاء الملف أو سجلّ النظام المعرَّف بواسطة error_log
. يمكن لهذه الميزة أن تكون مفيدة جدًّا في بيئة الإنتاج، إذ يمكن تسجيل الأخطاء التي تحدث ثم إنشاء تقرير بالإستناد إلى ذلك.
التحكّم بالأخطاء من قبل المستخدم
إن كنت ترى بأنّ الطريقة الافتراضية للتعامل مع الأخطاء في لغة PHP غير ملائمة بالنسبة لك، يمكنك التعامل مع أنواع متعددة من الأخطاء باستخدام المتحكّم الخاص بك وذلك بمعالجته باستخدام الدالة set_error_handler()
، ويمكن بعد ذلك التعامل مع الأخطاء بالطريقة التي تراها مناسبة، فعلى سبيل المثال يمكنك عرض صفحة أخطاء خاصة للمستخدم ثم التبليغ عن الخطأ بطريقة أخرى كإرسال التقرير عبر البريد الإلكتروني. جديرٌ بالذكر أنّه لا يمكن التعامل مع بعض أنواع الأخطاء بهذه الطريقة.
الأخطاء في PHP 7
تختلف طريقة التبليغ عن معظم الأخطاء في الإصدار السابع من اللغة، فبدلًا من التبليغ عنها بواسطة الميكانيكية الكلاسيكية للتبليغ عن الأخطاء والتي يستخدمها الإصدار الخامس من اللغة، يكون التبليغ عن الأخطاء عن طريق رمي استثناءات الأخطاء (Error exceptions).
وكما هو الحال مع الاستثناءات الاعتيادية، تنتقل استثناءات الأخطاء من طبقة إلى أخرى إلى حين الوصول إلى أول كتلة catch
مطابقة، وفي حال عدم وجود مثل هذه الكتلة تستدعي اللغة متحكّم الأخطاء الافتراضي الذي جرت معالجته باستخدام الدالة set_exception_handler()
، وفي حال عدم وجود متحكّم أخطاء افتراضي يجري تحويل الاستثناء إلى خطأ من نوع fatal
تتعامل اللغة معه كأي خطأ تقليدي.
لما كان التسلسل الهرمي للصنف Error
لا يرث من الصنف Exception
، فإنّ الشيفرة التي تستخدم الكتل catch (Exception $e) { ... }
للتعامل مع الاستثناءات غير الملتقطة في PHP 5 لن تلتقط الأخطاء بواسطة هذه الكتل، ويجب استخدام كتلة catch (Error $e) { ... }
أو استخدام متحكّم بالأخطاء بواسطة الدالة set_exception_handler()
.
التسلسل الهرمي للصنف Error
Throwable
Error
ArithmeticError
DivisionByZeroError
AssertionError
ParseError
TypeError
ArgumentCountError
Exception
...