PHPبرمجة

PHP – الاستثناءات و معالجة اﻷخطاء (Exceptions && Error Handling)

اﻷخطاء هي أغلاط أو عيوب تحدث أثناء تنفيذ البرنامج وتكون هذه اﻷخطاء مفاجئة أو غير متوقعة, ولا يستطيع البرنامج تعامل معها أو إصلاحها بنفسه.
وهذه اﻷخطاء يجب إصلاحها قبل تنفيذ البرنامج. مثال: الخطأ الذي يحدث عندما تكون لدينا دالة تكرار (loop) لا نهائية.

اﻹستثناءات (Exceptions) هي أشياء غير متوقعة تحدث أثناء تنفيذ البرنامج, مثال: عندما نقوم باستدعاء ملف معين, وذالك الملف غير موجود, إذن هنا ستكون مشكلة وقد تتسبب في إيقاف البرنامج إذا لم نقوم بالبحث عن ملف أخر أو نقوم بإنشاء ملف جديد مكانه, إذن في هذه الحالة البرنامج يستطيع التعامل مع المشكل وإصلاحه بنفسه, هذه هي اﻹستثناءات.

لماذا يجب علينا إصلاح اﻷخطاء و وضع اﻹستثناءات (Exceptions)؟

عند حدوث خطأ ما في لغة php, فإن الخادوم يقوم بإظهار رسالة الخطأ في الصفحة بدلا من إظهار المحتوى, وهذه رسالة تحتوي على المعلومات التي تتعلق بالخطأ وأيضا تحتوي على اسم الملف الذي حدث فيه الخطأ.
للهذا يجب علينا إصلاح اﻷخطاء ووضع استثناءات لكي لا تظهر للمستخدمين ﻷن ذالك يمكن أن ينشئ ثغرات أمنية وتسمح للمهاجمين بحقن أكواد برمجية خبيثة تمكنهم من اختراق موقعك وسهولة والسيطرة عليه, للهذا عزيزي القارئ أنصحك و بشدة بأن تقوم بإصلاح جميع اﻷخطاء و وضع جميع اﻹحتمالات, لكي تتفادى اﻷخطاء في المستقبل.

إصلاح اﻷخطاء

سنرى بعض اﻷمثلة حول إصلاح اﻷخطاء:

في الكود أسفله سنقوم بتقسيم رقم 2 على 0, يعني: 2/0:

<?php

$number = 0;
$res = 2 / $number;
echo $res;

?>

إذن كما ترى في الصورة, ظهر لنا المشكل وأيضا ظهر لنا اسم الملف الذي وقع في المشكل, وهذا ربما يسبب في فقدان زوار موقعنا, ﻷنها رسالة مزعجة.

اﻷن سنقوم بإضافة شرط, وهو إذا كان المتغير $number يساوي صفر (0) فستظهر لنا رسالة تخبرنا أننا لا يمكننا القسمة على صفر, وإذا كان العكس سيقوم بالقسمة على صفر, وبهذا سنكون قد أصلحنا المشكل وتفادينا الرسالة المزعجة.

<?php

$number = 0;

if($number != 0){
	$res = 2 / $number;
}else{
	$res = 'لا يمكننا القسمة على صفر';
}

echo $res;

?>

كما ترى ظهرت رسالة توضح لنا أننا لا نستطيع القسمة على الصفر.

اﻷن سنقوم بعمل دالة, تقوم بالتعامل مع اﻷخطاء وإظهار رسائلها كما نريد, كما هو موضح في هذا المثال.

<?php

function ab9or_error($code, $msg, $file, $line)
{
	echo "لقد حدث خطأ!";
	echo "<br />";
	echo "كود الخطأ: " . $code;
	echo "<br />";
	echo "رسالة الخطأ: " . $msg;
	echo "<br />";
	echo "اسم الملف الذي حدث فيه المشكل: " . $file;
	echo "<br />";
	echo "رقم السطر: " . $line;
}

set_error_handler("ab9or_error");

$number = 0;
$res = 2 / $number;
echo $res;

?>

كما ترى قمنا بإنشاء دالة بإسم ab9or_error, يمكننا تسميتها كما نريد, هذه الدالة تأخد 4 برامترات (parameters).

البرامتر اﻷول $code: يحتوي على كود أو رقم الخطأ.
البرامتر الثاني $msg: يحتوي على رسالة الخطأ.
البرامتر الثالث $file: يحتوي على اسم الملف الذي حدث فيه المشكل.
البرامتر الرابع $line: تحتوي على رقم السطر الذي حدث فيه المشكل.

بداخل الدالة قمنا بكتابة النصوص التي ستظهر عند الخطأ, وقمنا بكتابة الرمز <br /> بعد كل سطر للكتابة في سطر جديد, وقمنا بإضافة المتغير $code لليظهر مكانه رقم الخطأ, وأيضا أضفنا المتغير $msg للتظهر مكانه رسالة الخطأ, وأضفنا المتغير $file ليظهر مكانه اسم الملف الذي حدث فيه المشكل, وأضفنا المتغير $line ليظهر مكانه رقم السطر الذي حدث فيه المشكل.
أيضا يمكننا تسجيل الخطأ في ملف log أو إرساله إلى المبرمج ليقوم بإصلاحه, من خلال وضع الكود داخل الدالة ab9or_error.

بعد أن انتهينا من إنشاء الدالة ab9or_error قمنا باستدعائها من خلال الدالة set_error_handler, ﻷنها هي التي ستحول جميع رسائل الخطأ إلى دالة ab9or_error التي قمنا بإنشائها.

النتيجة ستكون هكذا.

اﻹستثناءات؟

كما رأينا سابقا, قمنا بالتعامل مع الخطأ وغيرنا رسالته كما نريد, وذالك تم عبر دالة نحن أنشئناها.

لكن مع اﻹستثناءات لا نتعامل مع الدالة, بل نتعامل مع كائن, ومن خلال هذا الكائن نعرف جميع تفاصيل اﻹستثناء: رسالته, رقمه, الملف الذي حدث فيه اﻹستثناء, رقم سطر اﻹستثناء, وكل شيء.

هذا يعني عندما يحدث استثناء, يتم إنشاء كائن خاص به, يحتوي على تفاصيل الاستثناء.

في هذا الجدول سنرى بعض دوال (Methods أو Functions) التابعة لهذا الكائن.

دالة (Method)وصفمثال
getMessage()هذه الدالة ﻹظهار رسالة استثناء, ترجع لنا قيمة نصية (String).echo $e->getMessage();
getCode()هذه الدالة ﻹظهار رقم استثناء, ترجع لنا قيمة رقمية (Integer).echo $e->getCode();
getFile()هذه الدالة لإظهار الملف الذي حدث فيه استثناء, ترجع لنا قيمة نصية (String).echo $e->getFile();
getLine()هذه الدالة ﻹظهار السطر الذي حدث فيه استثناء, ترجع لنا قيمة رقمية (Integer).echo $e->getLine();
getTrace()هذه الدالة تحتوي على جميع معلومات استثناء, ترجع لنا مصفوفة (Array).print_r( $e->getTrace());
getTraceAsString()هذه الدالة تحتوي على جميع معلومات استثناء, ترجع لنا قيمة نصية (String).echo $e->getTraceAsString();

مثال عن استخدام try catch:

try catch finally

try {
    // هنا نكتب الكود الذي سيعمل إذا لم يكن هناك استثناء
}
catch (Exception $e) {
    // هنا نكتب الكود الذي سيحدث عند حدوث اﻹستثناء
}
finally {
    // اختيارية: هنا نكتب الكود الذي سيتم تنفيذه في كلتا الحالتين
    // يعني إذا حدث استثناء أو لم يحدث
}

شرح الكلمات التخصصة في اﻹستثناء(Exception):

try: الكود الذي سيتم تنفيذه, يعني عند حدوث مشكلة داخل بلوك (try) سينقل الى تنفيذ الكود الموجود داخل بلوك (catch).
catch: الكود الذي سيتم تنفيذه عند حدوث استثناء.
throw: تستخدم لتحديد نوع الإستثناء الذي سيرسل, وهي التي تقوم بتمرير اليه الرسالة المراد اظهارها.
finally: سوف يتم تنفيذ الكود الموجود بداخلها سواء حدث اﻹستثناء أو لم يحدث.

لكي نفهم جيدا عمل اﻹستثناءات, سنقوم بتطبيق هذا الكود.

<?php

function ab9or_showNumber($number){
	if($number > 10){
		throw new Exception('خطأ: هذا الرقم أكبر من 10', 52125);
	}

	echo $number;
}

try{

	ab9or_showNumber(15);

}catch(Exception $e){
	echo $e->getMessage();
}

?>

الجزء 1:
– في اﻷول قمنا بإنشاء دالة باسم ab9or_showNumber مع برامتر واحد وهو $number.
و وضعنا شرط بداخلها وهو:
– إذا كان البرامتر $number أكبر من رقم 10, سيتم إرسال استثناء مع رسالة والكود إلى الكائن, وإيقاف عمل الدالة.
– وإذا كان البرامتر $number يساوي أو أصغر من رقم 10 سيظهر لنا رقم الموجود في البرامتر $number.

الجزء 2:
بعد أن انتهينا من إنشاء الدالة, قمنا بإضافتها داخل بلوك (try), وأضفنا لها رقم 15 في البرامتر, بعدها قمنا بعمل بلوك (catch) مع المتغيير $e وهو الكائن الذي سنستخرج منه معلومات استثناء, بعدها قمنا بإضافة echo $e->getMessage();, لكي نقوم بطباعة رسالة استثناء.

النتيجة هي:

اﻷن في بلوك (try), سنقوم بتغيير رقم 15 إلى 6, يعني سنقوم باستبدال ab9or_showNumber(15); ب ab9or_showNumber(6);, بعدها ستكون النتيجة هي:

وفي اﻷخير يمكننا استعمال بلوك (finally), هذا البلوك اختياري, و يمكننا إضافته في اﻷخير إذا أردنا تنفيذ كود يعمل في كلتا الحالتين, يعني إذا كانا استثناء أو لم يكن هذا الكود سيتم تنفيذه.

الوسوم
اظهر المزيد

admin

اللهم علمنا ما ينفعنا وانفعنا بما علمتنا انك انت العليم الحكيم .. إسمي زكرياء الزحتي، من المغرب، من مواليد 1993 م في مدينة طنجة، مهتم في، (البرمجة - تطوير أنظمة وتطبيقات الويب - قواعد البيانات - تصميم صفحات الويب - أنظمة لينكس) . اكتب بما فيه فائدة للآخرين هنا .. سواءاً عن التقنية أو التجارب الشخصية أو مواضيع متنوعة .. اكتب وأدون تجاربي واشارككم بعض اللحظات والمواضيع المفيدة ..

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق