Error Handling

🟦 أولًا: ما هو الخطأ (Error) في PHP؟

الخطأ هو حالة غير طبيعية تحدث أثناء تنفيذ البرنامج وتؤدي إلى توقفه أو ظهور نتائج غير صحيحة. PHP تُصدر أنواعًا مختلفة من الأخطاء حسب طبيعتها وخطورتها.

🟦 ثانيًا: أنواع الأخطاء في PHP
1. Notice

🔹 إشعار بخطأ غير خطير، لا يوقف تنفيذ البرنامج.
مثال:

echo $x; // $x غير معرف مسبقًا
PHP
2. Warning

🔹 خطأ متوسط الخطورة، لا يوقف التنفيذ لكن قد يؤدي إلى مشاكل.
مثال:

include("file.php"); // الملف غير موجود
PHP
3. Fatal Error

🔴 خطأ قاتل، يوقف تنفيذ البرنامج مباشرة.
مثال:

undefinedFunction(); // استدعاء دالة غير موجودة
PHP
4. Parse Error (Syntax Error)

🔴 خطأ في الكتابة (الصياغة) يمنع تشغيل الملف أصلًا.
مثال:

echo "Hello  // نسيان إغلاق علامة التنصيص
PHP
🟦 ثالثًا: إعدادات عرض الأخطاء
1. display_errors

🔹 تتحكم بإظهار الأخطاء في المتصفح (مفيدة أثناء التطوير).

2. error_reporting

🔹 تحدد أنواع الأخطاء التي سيتم عرضها.

✅ تفعيل عرض الأخطاء داخل الكود:
ini_set('display_errors', 1);
error_reporting(E_ALL);
PHP

⚠️ لا يُنصح بإظهار الأخطاء للمستخدم النهائي في المواقع الحية (production)، بل تُسجل في ملف.

🟦 رابعًا: دوال التعامل مع الأخطاء
1. error_reporting()
error_reporting(E_ALL); // عرض كل أنواع الأخطاء
PHP
2. trigger_error() – إنشاء خطأ مخصص
trigger_error("هذه رسالة خطأ مخصصة", E_USER_WARNING);
PHP
3. set_error_handler() – تعيين دالة مخصصة للتعامل مع الأخطاء
function myErrorHandler($errno, $errstr, $errfile, $errline) {
    echo "⚠️ [$errno] $errstr في $errfile على السطر $errline";
}
set_error_handler("myErrorHandler");
PHP
🟦 خامسًا: التعامل مع الاستثناءات Try / Catch
✅ مثال أساسي:
try {
    throw new Exception("حدث خطأ ما!");
} catch (Exception $e) {
    echo "تم الإمساك بالاستثناء: " . $e->getMessage();
}
PHP

throw تُستخدم لرمي الاستثناء
try تُستخدم لتجربة تنفيذ كود يحتمل الخطأ
catch تُستخدم لإمساك الاستثناءات

✅ مثال مع finally (يعمل دائمًا في النهاية):
try {
    echo 10 / 0;
} catch (Throwable $e) {
    echo "خطأ: " . $e->getMessage();
} finally {
    echo "✅ انتهى التنفيذ";
}
PHP
🟦 سادسًا: إنشاء Exception مخصص
class CustomException extends Exception {}

try {
    throw new CustomException("هذا خطأ خاص");
} catch (CustomException $e) {
    echo $e->getMessage();
}
PHP
🟦 سابعًا: تخزين الأخطاء في ملف
ini_set("log_errors", 1);
ini_set("error_log", "errors.log");

error_log("حدث خطأ في الاتصال بقاعدة البيانات");
PHP
🟦 ثامنًا: التعامل مع Shutdown Function
function shutdownHandler() {
    $error = error_get_last();
    if ($error) {
        echo "حدث خطأ قاتل: " . $error['message'];
    }
}
register_shutdown_function("shutdownHandler");
PHP
🟦 تاسعًا: set_exception_handler()

لتسجيل جميع الاستثناءات غير المُلتقطة:

set_exception_handler(function($e) {
    echo "استثناء غير مُلتقط: " . $e->getMessage();
});
PHP
🟦 نصائح ومحاذير:

فوائد المعالجة الجيدة للأخطاء:

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

⚠️ محاذير:

  • لا تُظهر الأخطاء للمستخدم النهائي.
  • لا تستخدم die() و exit() كثيرًا داخل الإنتاج.
  • الاستثناءات الغير مُعالجة قد تُظهر ثغرات.