كيفية التقاط خطأ PHP الفادح (E_ERROR): الفخاخ والحلول

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

كيفية التقاط الخطأ الفادح في PHP (E_ERROR) دون أن تفقد صوابك

\n\n

هل سبق لك أن رأيت هذا؟ موقعك على PHP يعرض صفحة بيضاء فارغة دون أي خطأ. أو الأسوأ من ذلك - رسالة مخيفة Fatal error: Uncaught Error.... إذا كنت مطوراً يعمل مع PHP، فمن المحتمل أنك واجهت E_ERROR - أكثر أنواع الأخطاء إزعاجاً. على عكس التحذيرات (Warnings) أو الإشعارات (Notices)، فإن الخطأ الفادح يوقف تنفيذ السكريبت تماماً. والأكثر إحباطاً: أن كتلة try...catch القياسية لا تلتقطه.

\n\n

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

\n\n

لماذا لا ينقذك try...catch من E_ERROR؟

\n\n

دعنا نبدد الوهم فوراً: try...catch في PHP مصمم لمعالجة الاستثناءات (Exceptions). بينما E_ERROR هو خطأ (Error). هذان كيانان مختلفان. لم يسمح PHP قبل الإصدار 7.0 بالتقاط الأخطاء الفادحة على الإطلاق. بدءاً من PHP 7، ظهرت الفئة Error التي، مثل Exception، تطبق الواجهة Throwable. لكن هذا لا يعني أن أي E_ERROR يصبح تلقائياً استثناءً. على سبيل المثال، خطأ نفاد الذاكرة (Out of memory) أو استدعاء طريقة غير موجودة - لا تزال أخطاء فادحة لا يمكن دائماً اعتراضها عبر try...catch.

\n\n

إليك مثال بسيط:

\n\n
try {\n    $obj = new NonExistentClass(); // هذا سيسبب E_ERROR\n} catch (Throwable $e) {\n    echo 'التقطنا: ' . $e->getMessage();\n}
\n\n

في PHP 7+ سيعمل هذا الكود، لأن Throwable يتضمن Error. لكن إذا حدث الخطأ في مرحلة التجميع (مثل خطأ نحوي) أو في مرحلة الإغلاق (shutdown)، فإن try...catch يصبح عديم الفائدة.

\n\n

أهم 3 أخطاء فادحة في PHP وكيفية تجنبها

\n\n

1. استدعاء طريقة أو فئة غير موجودة

\n\n

الخطأ الفادح الأكثر شيوعاً هو Call to undefined method أو Class not found. يحدث عندما تحاول استدعاء طريقة غير موجودة، أو استخدام فئة غير محملة.

\n\n

كيفية تجنبه:

\n
    \n
  • استخدم دائماً التحميل التلقائي للفئات (spl_autoload_register أو Composer).
  • \n
  • تحقق من وجود الطريقة باستخدام method_exists().
  • \n
\n\n
if (method_exists($object, 'someMethod')) {\n    $object->someMethod();\n} else {\n    // معالجة\n}
\n\n

2. استنفاد الذاكرة (Allowed memory size exhausted)

\n\n

الخطأ Allowed memory size of X bytes exhausted هو خطأ فادح يحدث عندما يستهلك السكريبت ذاكرة أكثر من المسموح به. لا يمكن اعتراضه بالطريقة العادية.

\n\n

كيفية تجنبه:

\n
    \n
  • حسّن استعلامات قاعدة البيانات.
  • \n
  • استخدم المولدات (yield) لمعالجة المصفوفات الكبيرة.
  • \n
  • زد حد الذاكرة في php.ini أو عبر ini_set('memory_limit', '256M').
  • \n
\n\n

3. تجاوز وقت التنفيذ (Maximum execution time exceeded)

\n\n

على الرغم من أن هذا الخطأ ليس دائماً فادحاً، إلا أنه في بعض التهيئات يوقف تنفيذ السكريبت تماماً.

\n\n

كيفية تجنبه:

\n
    \n
  • استخدم set_time_limit(0) للسكريبتات الطويلة.
  • \n
  • قسّم العمليات الثقيلة إلى أجزاء.
  • \n
\n\n

كيفية التقاط الخطأ الفادح في PHP: 3 طرق مجربة

\n\n

الآن ننتقل إلى الجزء الرئيسي. هناك عدة تقنيات تسمح باعتراض E_ERROR وتنفيذ كود قبل أن يموت السكريبت.

\n\n

الطريقة 1. استخدام register_shutdown_function()

المدونات

توصيات الكتب