يك استسنا شي است كه خطا يا رفتار غير منتظره اسكريپتphp را توصيف ميكند .
كنترل اتفاقات وايجاد رفتار متناسب با آن درphp با استفاده ازتابع ويا كلاس ايجاد ميشوند . در اين رابطه توابع وكلاسهاي تعريف شده كاربر هم ميتواند مورد استفاده قرار گيرد.
استسناها ميتوانند در جهت كنترل عمليات نادرست مناسب باشند، واگر موردي پيش آيد، آنرا متوقف يا اصلاح نمايند.
براي درك بهتر مطالب بمثال زير توجه نمائيد، كه در آن هيچ كنترل كاربري وجود ندارد .نتيجه اجراي آن مطابق زير است.
<?php function divide($dividend, $divisor) { return $dividend / $divisor; } echo divide(5, 0); echo divide(15,5); ?>
Warning: Division by zero in E:\xampp\htdocs\xampp\vbtest\temp.php on line 4 3
همانطوريكه ملاحظه ميكنيد، براي دستور echo divide(5,0);پيغام خطا صادر ودستور بعدي هم اجرا گرديد .اين نتيجه خوبي نيست، وبايد رفتاربرنامه كنترل شود.
با دستورthrow ميتوان يك تابع يا متد رفتاري با استسنا ايجاد نمود .هنگاميكه استسنائي پرتاب ميشود، كدهاي بعدي آن اجرا نميگردد .اگر استسنائي شناسائي نشود، خطائي مختل كننده ويا پيغام غيرقابل فهم دريافت ميكنيد. براي درك بهتر مطلب، استنسائي ايجاد ميكنيم بدون آنكه آنرا مديريت كنيم.
مثال ـ در نمونه اسكريپت زير استسنا تقسيم بر صفر درست مديريت نشده است.
<?php function divide($dividend, $divisor) { if($divisor == 0) { throw new Exception("Division by zero"); } return $dividend / $divisor; } echo divide(5, 0); ?>
با اجراي مثال خطاي زيرا خواهيم داشت و اسكريپت غير منتظره متوقف ميشود،كه توقف عادي نيست.
Fatal error: Uncaught Exception: Division by zero in C:\webfolder\test.php:4
Stack trace: #0 C:\webfolder\test.php(9):
divide(5, 0) #1 {main} thrown in C:\webfolder\test.php on line 4
بااين اصلاح نسبت به مثالي قبلي ، پيغام خطا تا حدي در كنترل درآمد، اما كافي نيست .برعكس اين روش كنترل باعث توقف كامل برنامه ميشود .بعبارتي اگر دستوراتي ديگري هم وجود داشت اجرا نميگرديد .توقف ويا تداوم اجرا هنگام برخورد با خطا ، مناسب تراست تحت كنترل باشد.
براي جلوگيري از حطاي مثال بالا ميتوانيم از دستورthrow و try ... catch استفاده نمائيم.
با بكارگيري آنها ميتوان پيغام مناسب داده واز توقف غير منتظره پيش گيرى نموده ومطابق دلخواه نسبت به تداوم ويا توقف آن تصميم گرفت.
فرمت كليtry ...catch مطابق زير است .
try { code that can throw exceptions } catch(Exception $e) { code that runs when an exception is caught }
اين فرمت شامل دو بلوكtry{ } وcatch ( ) { } ميباشد .بلوك try شامل كديست كه ممكن است ايجاد استسنا نمايد .بلوكcatch كديست كه در موقعيت برخورد با استسنا اجرا ميگردد.
بطور كلي بلوكtry { } بخشي از برنامه بوده كه ميخواهيم رفتارش را كنترل و مديريت نمائيم .كنترل دراين بخش وبلوك هاي وابسته به آن با اين روش مربوط به بلوكtry بوده و بقيه بخشهاي برنامه مطابق معمول ميباشد .اگر در بلوكtry استسنائي برخورد شود، مابقي بلوك اجرا نميگردد.
مثال ـ در مثال زير نمايش پيغام دلخواه وروند توقف وتداوم درهنگام بروز استسنا در نظر گرفته شده است.
<?php function divide($dividend, $divisor) { if($divisor == 0) { throw new Exception("Division by zero"); } return $dividend / $divisor; } try { echo divide(5, 0); } catch(Exception $e) { echo "Unable to divide."; } ?>
در مثال بالا در بلوكcatch نشان ميدهد كه چه نوع استسنا بايد گرفته شود،و نام متغير براي دسترسي به مشخصات استسنا .در اين مثال نام استسناExcepion ونام متغير $eميباشد .
فرمت كلي درستور مطابق زيراست.
try { code that can throw exceptions } catch(Exception $e) { code that runs when an exception is caught } finally { code that always runs regardless of whether an exception was caught }
در اينجا يك بلوك نهائي يعنيfinally{ }اضافه گرديده كه درپايان اجراي بلوك try { }بدون توجه بلوكcatch اجرا ميگردد . اگر اين بلوك وجود داشته باشد، بلوك catchاختياريست، وميتواند نباشد .
مثال ـ در اين مثال هنگاميكه استسنا رخ ميدهد پيغام داده ميشود ودر نهايت بلوكtry پيغام اتمام "Process complete."داده ميشود .
<?php function divide($dividend, $divisor) { if($divisor == 0) { throw new Exception("Division by zero"); } return $dividend / $divisor; } try { echo divide(5, 0); } catch(Exception $e) { echo "Unable to divide. "; } finally { echo "Process complete."; } ?>
شئ استسنا داراي اطلاعاتي از خطاي رخ داده ورفتار تابع در برخورد با استسنا داشته كه ميتوان استفاده نمود .فرمت كلي ايجاد شئ مطابق زير است.
مقادير پارامترهاي دستور مطابق دو جدول زير است.
پارامتر | شرح |
---|---|
message | .اختياريست -پيغامي است كه نشان ميدهد جرا استسنا رخ داده است |
code | اختياريست -عدد صحيح بوده و براي تشخيص ساده تر پيغام مشابه استسناها ازهمديگر |
previous | .ديگري اتفاق بافتد ،آنرا در اين نگه ميداردcatch اختياريست -اگراستسنا دربلوك |
در جدول زير اطلاعاتيكه كه از شئ مربوطه ميتوان بدست آورد، را نشان ميدهد.
method | شرح |
---|---|
getMessage() | دليل رخ دادن استسنا را برگشت ميدهد |
getPrevious() | استسناي ديگري كه رخ داده نشان ميدهد |
getCode() | .كد استسنا را برگشت ميدهد |
getFile() | .مسير كامل فايلي كه استسنا رخ داده برگشت ميدهد |
getLine() | .شماره خط رخداد استسنا را برگشت ميدهد |
مثال ـ در مثال زير اطلاعات مربوط به رخداد استسنا را نشان ميدهد.
<?php function divide($dividend, $divisor) { if($divisor == 0) { throw new Exception("Division by zero", 1); } return $dividend / $divisor; } try { echo divide(5, 0); } catch(Exception $ex) { $code = $ex->getCode(); $message = $ex->getMessage(); $file = $ex->getFile(); $line = $ex->getLine(); echo "Exception thrown in $file on line $line: [Code $code] $message"; } ?>