Latest web development tutorials
×

PHP مسار

PHP مسار PHP مقدمة موجزة PHP تثبيت PHP قواعد PHP متغير PHP echo/print PHP أنواع البيانات PHP ثابت PHP سلسلة PHP مشغلي PHP If...Else PHP Switch PHP مجموعة PHP فرز مجموعة PHP Superglobals PHP While تداول PHP For تداول PHP وظيفة PHP المتغيرات السحرية PHP مساحات PHP الشيئية

PHP شكل

PHP شكل PHP مصادقة النماذج PHP شكل - الحقول المطلوبة PHP شكل - البريد الإلكتروني التحقق وURL PHP المثال شكل كامل PHP $_GET متغير PHP $_POST متغير

PHP دروس متقدمة

PHP المصفوفات متعددة الأبعاد PHP تاريخ PHP احتواء PHP ملف PHP تحميل ملف PHP Cookie PHP Session PHP E-mail PHP أمن E-mail PHP Error PHP Exception PHP فلتر PHP فلتر متقدم PHP JSON

PHP 7 الميزات الجديدة

PHP 7 الميزات الجديدة

PHP قاعدة بيانات

PHP MySQL مقدمة موجزة PHP MySQL صلة PHP MySQL إنشاء قاعدة بيانات PHP MySQL إنشاء جدول بيانات PHP MySQL إدراج بيانات PHP MySQL إدراج بيانات متعددة PHP MySQL القوائم المعدة PHP MySQL قراءة البيانات PHP MySQL WHERE PHP MySQL ORDER BY PHP MySQL UPDATE PHP MySQL DELETE PHP ODBC

PHP XML

XML Expat Parser XML DOM XML SimpleXML

PHP & AJAX

AJAX مقدمة موجزة AJAX PHP AJAX قاعدة بيانات AJAX XML AJAX البحث في الوقت الحقيقي AJAX RSS Reader AJAX تصويت

PHP الدليل المرجعي

PHP Array PHP Calendar PHP cURL PHP Date PHP Directory PHP Error PHP Filesystem PHP Filter PHP FTP PHP HTTP PHP Libxml PHP Mail PHP Math PHP Misc PHP MySQLi PHP PDO PHP SimpleXML PHP String PHP XML PHP Zip PHP Timezones PHP معالجة الصور PHP RESTful

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

يحدث استثناء لتغيير الخطأ النصي عندما المحدد التدفق الطبيعي.


ما هو غير طبيعي

تقدم PHP 5 طريقة جديدة لمعالجة الأخطاء وجوه المنحى.

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

عندما يتم تشغيل استثناء، وعادة ما يحدث:

  • يتم حفظ دولة القانون الحالي
  • يتم تبديل بتنفيذ التعليمات البرمجية ل(حسب الطلب) وظيفة معالج استثناء محددة مسبقا
  • في بعض الحالات، المعالج يجوز إعادة بدأت-من التعليمات البرمجية المخزنة في قانون الأحوال، إنهاء تنفيذ البرنامج النصي أو مواصلة النصي من رمز موقع مختلف

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

  • استثناء الاستخدام الأساسي
  • إنشاء معالج استثناء مخصصة
  • استثناءات متعددة
  • Rethrows
  • أعلى مستوى مجموعة معالج استثناء

ملاحظة: يجب أن الاستثناءات تستخدم فقط في حالة الخطأ، فإنه لا ينبغي أن تستخدم في نقطة محددة للانتقال إلى موقع آخر في التعليمات البرمجية.


استثناء الاستخدام الأساسي

عندما يتم طرح استثناء، رمز لاحق لا المضي قدما، سوف PHP محاولة للعثور على مطابقة "الصيد" كتلة.

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

دعونا نحاول رمي استثناء، ولكن لا قبض عليه:

<?php
// 创建一个有异常处理的函数
function checkNum($number)
{
	if($number>1)
	{
		throw new Exception("Value must be 1 or below");
	}
	return true;
}

// 触发异常
checkNum(2);
?>

رمز أعلاه سوف تحصل خطأ مشابهة لهذه:

Fatal error: Uncaught exception 'Exception' with message 'Value must be 1 or below' in /www/w3big/test/test.php:7 Stack trace: #0 /www/w3big/test/test.php(13): checkNum(2) #1 {main} thrown in /www/w3big/test/test.php on line 7

محاولة، ورمي والصيد

لتجنب الأخطاء التي تظهر في المثال أعلاه، نحن بحاجة إلى إنشاء الرمز المناسب لمعالجة الاستثناءات.

وينبغي أن تتضمن السليم معالجة رمز الاستثناء:

  1. محاولة - باستخدام وظيفة غير طبيعية يجب أن يكون موجودا داخل كتلة "محاولة". إذا يتم تشغيل أي استثناء، وسوف تستمر الكود كما هو معتاد. ومع ذلك، إذا يتم تشغيل استثناء، فإنه سيتم رمي استثناء.
  2. رمي - في كيفية تحريك أحكام الاستثناء. كل "رمي" يجب أن تتوافق مع "الصيد" واحد على الأقل.
  3. قبض - "الصيد" كتلة يمسك استثناء وبإنشاء كائن يحتوي على الرسالة استثناء.

السماح يؤدي استثناء:

<?php
// 创建一个有异常处理的函数
function checkNum($number)
{
	if($number>1)
	{
		throw new Exception("变量值必须小于等于 1");
	}
		return true;
}
	
// 在 try 块 触发异常
try
{
	checkNum(2);
	// 如果抛出异常,以下文本不会输出
	echo '如果输出该内容,说明 $number 变量';
}
// 捕获异常
catch(Exception $e)
{
	echo 'Message: ' .$e->getMessage();
}
?>

سوف رمز أعلاه الحصول على خطأ من هذا القبيل:

Message: 变量值必须小于等于 1

الأمثلة توضح:

رمز أعلاه يطرح استثناء وأدرك أنه:

  1. إنشاء checkNum وظيفة (). يكشف ما إذا كان العدد أكبر من واحد. إذا كان كذلك، يتم طرح استثناء.
  2. استدعاء وظيفة checkNum () في كتلة "محاولة".
  3. checkNum () يتم طرح استثناء وظيفة.
  4. يتلقى "كاتش" كتلة الاستثناء ويخلق الكائن الذي يحتوي على معلومات حول استثناء ($ ه).
  5. من خلال الدعوة $ ه من هذه الأشياء استثناء> getMessage ()، والإخراج من رسالة خطأ للاستثناء.

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


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

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

الطبقة استثناء مخصصة يرث كل سمات محددة في الطبقة PHP استثناء، قد ترغب في إضافة وظائف مخصصة.

تبدأ من خلال إنشاء فئات استثناء:

<?php
class customException extends Exception
{
	public function errorMessage()
	{
		// 错误信息
		$errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile()
		.': <b>'.$this->getMessage().'</b> 不是一个合法的 E-Mail 地址';
		return $errorMsg;
	}
}

$email = "[email protected]";

try
{
	// 检测邮箱
	if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
	{
		// 如果是个不合法的邮箱地址,抛出异常
		throw new customException($email);
	}
}

catch (customException $e)
{
//display custom message
echo $e->errorMessage();
}
?>

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

الأمثلة توضح:

رمز أعلاه يطرح استثناء، ومن خلال فئة استثناء مخصصة لالتقاط ما يلي:

  1. customException () فئة امتدادا للطبقة استثناء القديمة لخلق. بحيث يرث كل سمات وأساليب الفئة استثناء القديمة.
  2. إنشاء ERRORMESSAGE وظيفة (). إذا كان عنوان البريد الإلكتروني غير صالح، تقوم الدالة بإرجاع رسالة خطأ.
  3. تم تعيين المتغير $ البريد الإلكتروني إلى سلسلة عنوان البريد الإلكتروني غير صالح.
  4. تنفيذ "محاولة" كتلة، لأن عنوان البريد الإلكتروني غير صالح، وبالتالي يطرح استثناء.
  5. "الصيد" كتلة للقبض على الاستثناء ويعرض رسالة خطأ.

استثناءات متعددة

يمكنك استخدام استثناءات متعددة كبرنامج نصي للكشف عن مجموعة متنوعة من الحالات.

يمكنك استخدام كتلة متعددة if..else، أو كتلة من تبديل الرمز، أو استثناءات متعددة العش. ويمكن لهذه الاستثناءات استخدام الطبقات استثناء مختلفة والعودة رسائل خطأ مختلفة:

<?php
class customException extends Exception
{
	public function errorMessage()
	{
		// 错误信息
		$errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile()
		.': <b>'.$this->getMessage().'</b> 不是一个合法的 E-Mail 地址';
		return $errorMsg;
	}
}

$email = "[email protected]";

try
{
	// 检测邮箱
	if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
	{
		// 如果是个不合法的邮箱地址,抛出异常
		throw new customException($email);
	}
	// 检测 "example" 是否在邮箱地址中
	if(strpos($email, "example") !== FALSE)
	{
		throw new Exception("$email 是 example 邮箱");
	}
}
catch (customException $e)
{
	echo $e->errorMessage();
}
catch(Exception $e)
{
	echo $e->getMessage();
}
?>

الأمثلة توضح:

رمز أعلاه اختبارات شرطين، إذا لم يتم استيفاء أي شرط واحد، ثم رمي استثناء:

  1. customException () فئة امتدادا للطبقة استثناء القديمة لخلق. بحيث يرث كل سمات وأساليب الفئة استثناء القديمة.
  2. إنشاء ERRORMESSAGE وظيفة (). إذا كان عنوان البريد الإلكتروني غير صالح، تقوم الدالة بإرجاع رسالة خطأ.
  3. تم تعيين المتغير $ البريد الإلكتروني إلى سلسلة هذا هو عنوان بريد إلكتروني صالح، ولكن يحتوي على السلسلة "المثال".
  4. تنفيذ "محاولة" كتلة من التعليمات البرمجية في الشرط الأول، يتم طرح أي استثناء.
  5. منذ البريد الإلكتروني يحتوي على السلسلة "المثال"، والشرط الثاني مشغلات استثناء.
  6. "الصيد" كتلة المصيد الاستثناء وعرض رسالة الخطأ المناسبة.

إذا تم إلقاء استثناء الطبقة customException ولكن لم يدرك customException، القبض إلا استثناء قاعدة، حيث الاستثناءات التعامل معها.


Rethrows

في بعض الأحيان، عندما يتم طرح استثناء، قد ترغب في تختلف عن الطريقة القياسية للتعامل معها. قد مرة أخرى أن يلقى في كتلة "الصيد".

يجب أن تكون مخفية النصي من أخطاء النظام المستخدم. للمبرمجين، قد تكون أخطاء النظام مهم، ولكن المستخدم ليس مهتما بها. لجعله أسهل للمستخدمين لاستخدام، يمكنك رمي استثناء مرة أخرى مع رسالة ودية المستخدم نسبيا:

<?php
class customException extends Exception
{
	public function errorMessage()
	{
		// 错误信息
		$errorMsg = $this->getMessage().' 不是一个合法的 E-Mail 地址。';
		return $errorMsg;
	}
}

$email = "[email protected]";

try
{
	try
	{
		// 检测 "example" 是否在邮箱地址中
		if(strpos($email, "example") !== FALSE)
		{
			// 如果是个不合法的邮箱地址,抛出异常
			throw new Exception($email);
		}
	}
	catch(Exception $e)
	{
		// 重新抛出异常
		throw new customException($email);
	}
}
catch (customException $e)
{
	// 显示自定义信息
	echo $e->errorMessage();
}
?>

الأمثلة توضح:

تم الكشف عن رمز أعلاه في عنوان البريد الإلكتروني إذا كان يحتوي على السلسلة "المثال". إذا كان هناك، مرة أخرى، يتم طرح استثناء:

  1. customException () فئة امتدادا للطبقة استثناء القديمة لخلق. بحيث يرث كل سمات وأساليب الفئة استثناء القديمة.
  2. إنشاء ERRORMESSAGE وظيفة (). إذا كان عنوان البريد الإلكتروني غير صالح، تقوم الدالة بإرجاع رسالة خطأ.
  3. تم تعيين المتغير $ البريد الإلكتروني إلى سلسلة هذا هو عنوان بريد إلكتروني صالح، ولكن يحتوي على السلسلة "المثال".
  4. "حاول" كتلة يحتوي على كتلة أخرى "محاولة" من التعليمات البرمجية، لذلك يمكنك رمي استثناء مرة أخرى.
  5. منذ البريد الإلكتروني يحتوي على السلسلة "المثال"، وبالتالي يؤدي استثناء.
  6. "الصيد" كتلة للقبض على استثناء وإعادة رمي "customException".
  7. القبض على "customException"، ويعرض رسالة خطأ.

إذا لم يتم اكتشاف استثناء في كتلة الحالي "محاولة"، فإنه يبحث عن كتلة الصيد على مستوى أعلى.


أعلى مستوى مجموعة معالج استثناء

set_exception_handler وظيفة () يمكن تعيين للتعامل مع جميع استثناء uncaught الدالات المعرفة من قبل المستخدم.

<?php
function myException($exception)
{
	echo "<b>Exception:</b> " , $exception->getMessage();
}

set_exception_handler('myException');

throw new Exception('Uncaught Exception occurred');
?>

إخراج التعليمات البرمجية أعلاه كما يلي:

Exception: Uncaught Exception occurred

في رمز أعلاه، ليس هناك "الصيد" كتلة، ولكن أثار معالج الاستثناء المستوى الأعلى. وينبغي أن تستخدم هذه الوظيفة للقبض على كل استثناء uncaught.


حكم استثناء

  • يحتاج معالجة رمز استثناء لتوضع في كتلة المحاولة، من أجل تصفية الاستثناءات الممكنة.
  • يجب أن يكون لكل كتلة التعليمات البرمجية رمي أو محاولة واحدة على الأقل كتلة التقاط المقابلة.
  • يمكنك استخدام كتل التقاط عدة لصيد أنواع مختلفة من الاستثناءات.
  • قد تكون ضمن كتلة التعليمات البرمجية محاولة يلقي كتلة الصيد (القيت مرة أخرى) استثناء.

باختصار: إذا كنت رمي ​​استثناء، يجب أن قبض عليه.