معالجة الأخطاء




معالجة الأخطاء الافتراضي في PHP بسيط جداً . يتم ارسال رسالة الخطأ بإسم الملف أو رقم السطر أو شرح الخطأ في رسالة الى المتصفح .



معالجة الأخطاء


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

يحتوي الدورة لدينا على بعض طرق فواص الأخطاء السائدة في لغة PHP .

سنقوم بعرض طرق مختلفة لمعالجة الأخطاء :

  • رسالة بسيطة من خلال die() .

  • إحداث رسائل أخطاء تقليدية .

  • تقاير الأخطاء .





معالج الأخطاء البسيط die()


يظهر المثال التالي كود بسيط حيث يفتح ملف نصي :
<?php
$file=fopen("welcome.txt","r");
?>

اذا لم يتم إيجاد الملف سيتم إظهار رسالة خطئ :
Warning: fopen(welcome.txt) [function.fopen]: failed to open stream:
No such file or directory in C:webfoldertest.php on line 2



لتجنب رسالة الخطأ مثل المثال السابق سيتم فحص فيما اذا كان الملف موجود قبل المحاولة بالدخول اليه :
<?php
if(!file_exists("welcome.txt"))
{
die("File not found");
}
else
{
$file=fopen("welcome.txt","r");
}
?>

ان لم يتم ايجاد النص ستظهر هذه الرسالة على المتصفح :
File not found





إنشاء معالج أخطاء


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

يجب أن يكون معالج الأخطاء ويجب أن يحمل قيمتين على الأقل ( مستوى الخطأ و رسالة الخطأ ) ولكن يمكن قبول خمسة قيم ( اختياري : الملف , رقم السطر , محتوى الخطأ ) .

التركيبة


error_function(error_level,error_message,
error_file,error_line,error_context)



القيمةالشرح
error_levelمطلوب . يحدد مستوى تقرير الخطأ نوع الخطأ المعرّف للمستخدم . كما يجب أن يكون رقم للقيمة .
error_messageمطلوب . تحديد رسالة الخطأ
error_fileاختياري . تحدد اسم الملف بحيث وقوع الخطأ .
error_lineاختياري . تحدد رقم السطر حيث وقوع الخطأ .
error_contextاختياري . تحدد المصفوفة التي تحتوي على كل متغير و قيمهم المستخدمة حيث وقوع الخطأ .

مستويات تقارير الخطأ


تحتوي مستويات تقارير الاخطاء على أنواع مختلفة والتي تعالج الأخطاء التي يمكن أن تستخدم لأجل مايلي :


القيمةالثوابتالشرح
2E_WARNINGNon-fatal run-time errors. Execution of the script is not halted
8E_NOTICERun-time notices. The script found something that might be an error, but could also happen when running a script normally
256E_USER_ERRORFatal user-generated error. This is like an E_ERROR set by the programmer using the PHP function trigger_error()
512E_USER_WARNINGNon-fatal user-generated warning. This is like an E_WARNING set by the programmer using the PHP function trigger_error()
1024E_USER_NOTICEUser-generated notice. This is like an E_NOTICE set by the programmer using the PHP function trigger_error()
4096E_RECOVERABLE_ERRORCatchable fatal error. This is like an E_ERROR but can be caught by a user defined handle (see also set_error_handler())
8191E_ALLAll errors and warnings, except level E_STRICT (E_STRICT will be part of E_ALL as of PHP 6.0)

الآن سنقوم بإنشاء function حيث يعالج الأخطاء :
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br />";
echo "Ending Script";
die();
}

يعتبر الكود في المثال السابق بسيط جداً . عندما يتم التعيين سيتم معرفة مستوى الخطأ و رسالة الخطأ . ثم سيتم إظهار رسالة الخطأ و مستوى الخطأ ثم حذف السكربت .

و الآن وبعد إنشاء معالج للأخطاء سنحتاج الى معرفة أن سظهر بلضبط .



ضبط معالج الأخطاء


يمكن معالجة الأخطاء من خلال استخدام معالج الأخطاء في PHP . سنقوم بإنشاء function فوق معالج الأخطاء الافتراضي لمدة السكربت .

يمكن تغيير معالج الأخطاء من أجل تطبيق بعض التغيرات الخاصة بالأخطاء البسيطة و بتلك الطريقة يمكن معالجة أخطاء مختلفة بطرق مختلفة . على أي حال في هذا المثال سنقوم باستخدام معالج الأخطاء لجميع أنواع الأخطاء :
set_error_handler("customError");

يمكن set_error_handler() أن يتحكم بجميع الأخطاء و فقط حتاج قيمة واحدة و ان أردت اضافة قيمة أخرى فهي تحديد مستوى الخطأ .

مثال

اختبار معالجة الأخطاء من خلال المحاولة بإظهار متغير غير موجود أصلاً :
<?php
//error handler function
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr";
}//set error handler
set_error_handler("customError");//trigger error
echo($test);
?>



ستكون النتيجة على المتصفح كالتالي :
Error: [8] Undefined variable: test




إستكشاف الأخطاء


يمكن استخدام استكشاف الأخطاء عند حدوث ادخال غير شرعي وذلك سيتم حدوثه من خلال trigger_error() وذلك في السكربت حيث يمكن للمستخدمين وضع بياناتهم .

مثال

في المثال التالي سيتم حدوث الخطأ اذا كان المتغير test أكبر من 1 :
<?php
$test=2;
if ($test>1)
{
trigger_error("Value must be 1 or below");
}
?>

ستكون النتيجة على المتصفح كالتالي :
Notice: Value must be 1 or below
in C:webfoldertest.php on line 6

يمكن اظهار الخطأ في أي مكان في السكربت و ذلك بإضافة قيمة أخرى كما يمكنك تحديد مستوى الخطأ الذي سيظهر .

أنواع الأخطاء المحتملة 


  • E_USER_ERROR : خطأ مروع يحدث عند خطأ يحدثه المستخدم و هذا الخطأ لايمكن تغطيته . يكون انجاز السكربت متوقف .

  • E_USER_WARNING : خطأ غير مروع يتم التحذير فيه و يكون إنجاز السكربت غير متوقف .

  • E_USER_NOTICE : ملاحظة عند امكانية حدوث خطأ معين و لكن يمكن أن يحدث أيضاً حتى في الحالة العادية للسكربت .

مثال

في هذا المثال سيتم استدعاء الخطأ E_USER_WARNING اذا كان المتغير test أكبر من الرقم 1 و اذا حدث E_USER_WARNING سنستخدم معالج الأخطاء و سيتم إنهاء السكربت :
<?php
//error handler function
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br />";
echo "Ending Script";
die();
}//set error handler
set_error_handler("customError",E_USER_WARNING);//trigger error
$test=2;
if ($test>1)
{
trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>



ستظهر النتيجة على المتصفح كالتالي :
Error: [512] Value must be 1 or below
Ending Script

و الأن تعلمنا إنشاء أخطاء و كيفية استكشافهم و الآن سنتعلم حول أخطاء تسجيل الدخول .



أخطاء السجلات


بشكل افتراضي ترسل PHP سجلات الأخطاء الى نظام سجل السيرفر أو الملف و ذلك اعتماداً على كيفية ضبط اعدادات error_log في ملف php.ini . باستخدام error_log() يمكن ارسال سجلات الأخطاء الى ملف أو وجهة مخصصة .

تعتبر طريقة جيدة بارسال سجلات الأخطاء لبريدك الالكتروني و بذلك يتم ارسال التنبيهات لبريدك عند تحديد الأخطاء .

ارسال رسالة خطأ بالبريد الالكتروني


في المثال التالي سنقوم بارسال بريد اللكتروني برسالة الخطأ و إنهاء السكربت اذا حدث ذلك الخطأ :
<?php
//error handler function
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br />";
echo "Webmaster has been notified";
error_log("Error: [$errno] $errstr",1,
"someone@example.com","From: webmaster@example.com");
}//set error handler
set_error_handler("customError",E_USER_WARNING);//trigger error
$test=2;
if ($test>1)
{
trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>



ستظهر النتجة على المتصفح كالتالي
Error: [512] Value must be 1 or below
Webmaster has been notified
And the mail received from the code above looks like this:
Error: [512] Value must be 1 or below

ليس من الضروري استخدام هذه الطريقة لكل الأخطاء لأن الأخطاء النظامية ينبغي أن ترسل السجلات الى السيرفر باستخدام نظام السجلات الافتراضي الخاص بلغة PHP .




ليست هناك تعليقات:

إرسال تعليق