English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

دروس PHP الأساسية

دروس PHP متقدمة

PHP & MySQL

كتيب مرجعي PHP

معالجة الاستثناءات في PHP

في هذا الدرس، ستتعلم كيفية تحفيز وتقاطع الاستثنائية في PHP.

ما هي الاستثنائية

الاستثنائية هي إشارة تُظهر حدوث استثنائية أو خطأ ما. قد تكون الاستثنائية بسبب عدة أسباب، مثل فشل الاتصال بالقاعدة البيانات أو استعلام الفشل، أو أن الملف الذي تحاول الوصول إليه غير موجود إلخ.

يقدم PHP ميكانيزم معالجة استثنائية قويًا، مما يتيح لك معالجة الاستثنائية بطريقة جميلة. بالمقارنة مع PHP التقليديةمعالجة الأخطاءنظامًا معاكسًا، معالجة الاستثنائية هي وسيلة لمعالجة الأخطاءموجهيقدم هذا الأسلوب شكلًا أكثر تحديدًا ومرنةً من التقرير بالأخطاء. تم إدخال نموذج الاستثنائية لأول مرة في PHP 5.

استخدام Throw و Try ... Catch

في النظام الأساسي القائم على الاستثنائية، يتم كتابة كود البرنامج في كتلة try، وعندما تحدث استثنائية أثناء تنفيذ الكود في كتلة try، يمكن استخدام جملة throw لتحفيز الاستثنائية. ثم يتم التقاطع وتحليلها بواسطة كتلة أو أكثر من الكتلات التقاطع.

مثال يوضح كيف يعمل معالجة الاستثنائية:

<?php
function division($dividend, $divisor){
    // إذا كان الموزع صفرًا، فتم رمي الاستثنائية
    if($divisor == 0){
        throw new Exception('استثنائية تقسيم بالصفر.');
    }
        $quotient = $dividend / $divisor;
        echo \
    }
}
 
try{
    division(10, 2);
    division(30, -4);
    division(15, 0);
    
    // إذا تم رمي الاستثنائية، فإن السطور التالية لن تنفذ
    echo '<p>كل شيء تم تنفيذه بنجاح.</p>';
}
    // معالجة الاستثنائية
    echo \
}
 
// تستمر في التنفيذ
echo \
?>

You may wonder what this code is about. Well, let's go through each part of this code one by one to better understand.

Explanation of code usage

PHP's exception handling system has four basic parts: try, throw, catch, and Exception class. The following list describes the working principles of each part.

  • The division() function in the example checks if the divisor is equal to zero. If so, it throws an exception using PHP's throw statement. Otherwise, this function performs division with the given numbers and displays the result.

  • Then, in the try block, call the division() function with different parameters. If an exception is generated while executing the code within the try block, PHP will stop executing at that point and try to find the corresponding catch block. If found, the code in the catch block will be executed; otherwise, a fatal error will be generated.

  • Catch blocks typically catch exceptions thrown from the try block and create an object containing exception information ($e). You can retrieve the error message from this object using the getMessage() method of the exception.

PHP's Exception class also provides methods such as getCode(), getFile(), getLine(), and getTraceAsString() to generate detailed debugging information.

<?php
//Disable default error reporting
error_reporting(0);
 
try{
    $file = "somefile.txt";
    
    //Attempt to open file
    $handle = fopen($file, "r");
    if(!$handle){
        throw new Exception("Unable to open file!", 5);
    }
    
    //Attempt to read file content
    $content = fread($handle, filesize($file));
    if(!$content){
        throw new Exception("Could not read file!", 10);
    }
    
    //Close file handle
    fclose($handle);
    
    //Show file content
    إchos $content;
}
    إchos '<h3>Caught Exception!</h3>';
    إchos '<p>Error message: '. ($e->getMessage()). '</p>';    
    إchos '<p>File: '. ($e->getFile()). '</p>';
    إchos '<p>Line: '. ($e->getLine()). '</p>';
    echo "<p>كود الخطأ: " . $e->getCode() . "</p>";
    echo "<p>تتبع: " . $e->getTraceAsString() . "</p>";
}
?>

يمكن أن يختار بناء استثناء استقبال رسالة الاستثناء وكود الاستثناء. على الرغم من أن رسالة الاستثناء تستخدم عادةً لعرض معلومات عامة حول السبب، إلا أن كود الاستثناء يمكن استخدامه لتصنيف الأخطاء. يمكن استرداد الكود الخاص بالاستثناء لاحقًا من خلال طريقة getCode() من Exception.

نصيحة:يُستخدم الاستثناءات فقط للتعامل مع حالات استثنائية؛ لا يجب استخدامها لتعريف عملية التطبيق العادية، مثل القفز إلى موقع آخر في سكربت. هذا يمكن أن يؤثر سلبًا على أداء التطبيق.

تعريف استثناءات مخصصة

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

<?php
// توسيع صنف Exception
class EmptyEmailException extends Exception {}
class InvalidEmailException extends Exception {}
 
$email = "[email protected]";
 
try{
    // إذا كان البريد الإلكتروني فارغًا، يتم إلقاء استثناء
    if($email == ""){
        throw new EmptyEmailException("<p>يرجى إدخال عنوان بريدك الإلكتروني!</p>");
    }
    
    // إذا كان البريد الإلكتروني غير صالح، يتم إلقاء استثناء
    if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {           
        throw new InvalidEmailException("<p><b>$email</b> ليس عنوان بريد إلكتروني صالح!</p>");
    }
    
    // إذا كان البريد الإلكتروني صالحًا، يتم عرض رسالة النجاح
    echo "<p>نجاح: تأكيد البريد الإلكتروني ناجح.</p>";
catch(EmptyEmailException $e){
    echo $e->getMessage();
catch(InvalidEmailException $e){
    echo $e->getMessage();
}
?>

في المثال السابق، نحن نستمد اثنين من فئات الاستثناءات الجديدة من الفئة الأساسية Exception:EmptyEmailExceptionوInvalidEmailException. يتم استخدام مكتبات القبض على الاستثناءات المتعددة لعرض رسائل خطأ مختلفة بناءً على نوع الاستثناء المولد.

بما أن هذه الفئات المخصصة للأستثناءات تنقل خصائص وطرق فئة Exception، يمكننا استخدام طرق الفئة مثل getMessage()، getLine()، getFile()، وما إلى ذلك لاستخراج معلومات خطأ عن عنصر الاستثناء.

تعيين معالج الاستثناء العالمي

كما تم مناقشته في هذا الفصل، إذا لم يتم استقبال الاستثناء، فإن PHP يولد خطأ حاسم يحتوي على رسالة "استثناء غير محتمل ...". قد تحتوي هذه الرسالة على معلومات حساسة، مثل اسم ملف المشكلة ورقم السطر. إذا لم تريد الكشف عن هذه المعلومات للمستخدم، يمكنك إنشاء دالة مخصصة وتسجيلها كمعالج استثناء مخصص باستخدام set_exception_handler() لتعامل جميع الاستثناءات غير المحتملة.

<?php
function handleUncaughtException($e){
    // عرض رسالة خطأ عامة للمستخدم
    echo "اه! حصل هناك مشكلة. يرجى المحاولة مرة أخرى، إذا استمرت المشكلة، يرجى الاتصال بنا.";
    
    // بناء سلسلة خطأ
    $error = "استثناء غير محتمل: " . $message = date("Y-m-d H:i:s - ");
    $error .= $e->getMessage() . " في ملف " . $e->getFile() . " في السطر " . $e->getLine() . "\n";
    
    // تسجيل تفاصيل الخطأ في ملف
    error_log($error, 3, "var/log/exceptionLog.log");
}
 
// تسجيل معالج الاستثناء المخصص
set_exception_handler("handleUncaughtException");
 
// قم بطرح الاستثناء
throw new Exception("Testing Exception!");
?>

ملاحظة:الاستثناءات غير المحتملة تؤدي دائمًا إلى إنهاء سكربت. لذلك، إذا كنت ترغب في استمرار سكربت في تنفيذ الأوامر بعد نقطة حدوث الاستثناء، فإن كل مكتبة try يجب أن تحتوي على至少 مكتبة catch م对应的ة.