معالجة الأخطاء في PHP: try/catch والتقنيات المتقدمة

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

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

ابدأ الدورة
```html

مقدمة: لماذا تعتبر معالجة الأخطاء أساس كود PHP الموثوق



يواجه كل مطور PHP أخطاء. سواء كان إدخال مستخدم غير صحيح، أو قاعدة بيانات غير متاحة، أو فشل غير متوقع في API — بدون معالجة سليمة للأخطاء، يتحول التطبيق إلى هيكل هش يمكن أن "ينهار" في أي لحظة. معالجة الأخطاء في PHP ليست مجرد وسيلة لتجنب شاشة الموت البيضاء (WSOD)، بل هي مبدأ أساسي لإنشاء تطبيقات ويب مستقرة وآمنة وقابلة للصيانة.



في هذه المقالة، سنقوم بتحليل جميع جوانب معالجة الأخطاء في PHP: من الآلية الأساسية try/catch إلى إنشاء استثناءات مخصصة واستراتيجيات متقدمة لتسجيل الأخطاء. ستتعلم كيفية تحويل فوضى الأخطاء إلى عملية يمكن التحكم فيها والتنبؤ بها.



الأساسيات: try, catch, finally و throw



كتلة try/catch — خط الدفاع الأول



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



<?phptry {    $file = fopen('important_data.txt', 'r');    if (!$file) {        throw new Exception('فشل فتح الملف');    }    // العمل مع الملف    fclose($file);} catch (Exception $e) {    echo 'خطأ: ' . $e->getMessage();}?>


من المهم أن نفهم: ليست كل الأخطاء في PHP هي استثناءات. التحذيرات القياسية (warning) والإشعارات (notice) لا تولد استثناءات تلقائياً. لاعتراضها، يلزم إعداد خاص (انظر قسم "التقنيات المتقدمة").



كتلة finally — تنفيذ مضمون



يتم تنفيذ كتلة finally دائماً، بغض النظر عما إذا تم طرح استثناء أم لا. هذا هو المكان المثالي لتحرير الموارد: إغلاق الملفات، أو اتصالات قاعدة البيانات، أو تحرير الذاكرة.



<?phpfunction processData($data) {    $connection = null;    try {        $connection = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');        // تنفيذ الاستعلامات        return $connection->query($data);    } catch (PDOException $e) {        // تسجيل الخطأ        error_log('DB Error: ' . $e->getMessage());        return false;    } finally {        // إغلاق الاتصال في أي حال        if ($connection) {            $connection = null;        }    }}?>


العامل throw — إنشاء استثناءاتنا الخاصة



باستخدام throw يمكنك توليد استثناءات في أي نقطة من الكود. يتيح لك ذلك إنشاء سيناريوهات أخطاء واضحة ويمكن التنبؤ بها.



<?phpfunction validateAge($age) {    if (!is_numeric($age)) {        throw new InvalidArgumentException('يجب أن يكون العمر رقماً');    }    if ($age < 0 || $age > 150) {        throw new OutOfRangeException('العمر خارج النطاق المسموح به');    }    return true;}

try { validateAge('abc');} catch (InvalidArgumentException $e) { echo 'خطأ في التحقق: ' . $e->getMessage();} catch (OutOfRangeException $e) { echo 'نطاق غير صحيح: ' . $e->getMessage();}?>


فئات الاستثناءات المخصصة



تغطي فئات الاستثناءات القياسية (Exception, RuntimeException, InvalidArgumentException) العديد من السيناريوهات، ولكن بالنسبة للمشاريع المعقدة، من الأفضل إنشاء تسلسلات هرمية خاصة بك للاستثناءات. هذا يحسن قابلية قراءة الكود ويبسط عملية التصحيح.



إنشاء فئة استثناء مخصصة



<?phpclass DatabaseException extends Exception {    private $queryString;        public function __construct($message, $query = '', $code = 0, Throwable $previous = null) {        $this->queryString = $query;        parent::__construct($m
```                

المدونات

توصيات الكتب