معالجة الأخطاء في PHP: try/catch وما بعدها — دليل شامل

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

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

ابدأ الدورة

معالجة الأخطاء في PHP: من التركيبات الأساسية إلى الأنماط الاحترافية



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



1. الأساسيات: تركيب try/catch و throw



في PHP، الاستثناءات هي كائنات من الفئة Exception (أو فئاتها الفرعية). تتكون الآلية الأساسية من ثلاث كلمات مفتاحية:



  • try — الكتلة التي يتم فيها تنفيذ الكود الذي قد يكون خطيراً؛
  • catch — الكتلة التي تلتقط الاستثناء؛
  • throw — العامل الذي "يرمي" الاستثناء.


لننظر إلى مثال بسيط:



<?phpfunction divide($a, $b) {    if ($b == 0) {        throw new Exception('القسمة على صفر غير ممكنة');    }    return $a / $b;}

try { echo divide(10, 0);} catch (Exception $e) { echo 'خطأ: ' . $e->getMessage();}?>


عندما يصل التنفيذ إلى throw، يغادر PHP الدالة الحالية فوراً ويبحث عن كتلة catch مناسبة. إذا تم العثور على catch — يستمر التنفيذ منها. إذا لم يتم العثور — يحدث خطأ فادح.



هام: بدءاً من PHP 7، معظم الأخطاء الداخلية (مثل القسمة على صفر) أصبحت ترمي استثناءات من الفئة DivisionByZeroError. لالتقاطها، يجب تحديد النوع المناسب.



2. إمكانيات متقدمة: catch متعددة و finally



غالباً ما قد تنشأ أنواع مختلفة من الاستثناءات في كتلة try واحدة. يسمح PHP بإنشاء عدة كتل catch لفئات مختلفة:



<?phpclass ValidationException extends Exception {}class DatabaseException extends Exception {}

try { // كود قد يرمي استثناءات مختلفة} catch (ValidationException $e) { echo 'خطأ تحقق: ' . $e->getMessage();} catch (DatabaseException $e) { echo 'خطأ قاعدة بيانات: ' . $e->getMessage();} catch (Exception $e) { // معالج عام لجميع الاستثناءات الأخرى echo 'خطأ غير معروف: ' . $e->getMessage();}?>


ترتيب كتل catch مهم: PHP يفحصها بالتسلسل، وأول كتلة مناسبة من حيث النوع تلتقط الاستثناء. لذلك، يتم وضع catch (Exception $e) العام دائماً في النهاية.



كتلة finally تُنفذ في جميع الحالات — بعد اكتمال try بنجاح، وبعد التقاط الاستثناء، وحتى إذا كان في catch عامل return. هذا هو المكان المثالي لإغلاق الملفات، تحرير الموارد أو التسجيل في السجل:



<?phpfunction readConfig($filename) {    $handle = fopen($filename, 'r');    if (!$handle) {        throw new Exception('تعذر فتح الملف');    }    try {        // قراءة البيانات        return fread($handle, filesize($filename));    } finally {        fclose($handle); // سيتم إغلاق الملف حتى في حالة الاستثناء    }}?>


3. فئات استثناءات مخصصة ومعالجات عامة



إنشاء فئات استثناءات مخصصة هو أداة قوية لتنظيم الكود. يكفي الوراثة من Exception:



<?phpclass InvalidEmailException extends Exception {    public function __construct($email, $code = 0, Throwable $previous = null) {        $message = "البريد الإلكتروني '$email' له تنسيق غير صحيح";        parent::__construct($message, $code, $previous);    }}

function validateEmail($ema

المدونات

توصيات الكتب