‎‎استسناهاي پي اچ پيPHP Exceptions -‎

Previous >    <Next  

‎استسنا(Exception) ‎چيست

‎‎يك استسنا شي است كه خطا يا رفتار غير منتظره اسكريپتphp را توصيف ميكند .

‎كنترل اتفاقات وايجاد رفتار متناسب با آن درphp با استفاده ازتابع ويا كلاس ايجاد ميشوند . ‎در اين رابطه توابع وكلاسهاي تعريف شده كاربر هم ميتواند مورد استفاده قرار گيرد.

‎استسناها ميتوانند در جهت كنترل عمليات نادرست مناسب باشند، واگر موردي پيش آيد، آنرا متوقف ‎يا اصلاح نمايند.

‎براي درك بهتر مطالب بمثال زير توجه نمائيد، كه در آن هيچ كنترل كاربري وجود ندارد .نتيجه ‎اجراي آن مطابق زير است.

<?php 
function divide($dividend, $divisor) {

  return $dividend / $divisor;
}
echo divide(5, 0);
echo divide(15,5);
?>	

--(go to editor for change code and run)

Warning: Division by zero in E:\xampp\htdocs\xampp\vbtest\temp.php on line 4
3 

‎همانطوريكه ملاحظه ميكنيد، براي دستور ‎ echo divide(5,0);‎‎پيغام خطا صادر ‎ودستور بعدي هم اجرا گرديد .اين نتيجه خوبي نيست، وبايد رفتاربرنامه كنترل شود.

‎‎پرتاب استسناThrowing an Exception -‎

‎با دستور‎throw‎ ميتوان يك تابع يا متد رفتاري با استسنا ايجاد نمود .هنگاميكه ‎استسنائي پرتاب ميشود، كدهاي بعدي آن اجرا نميگردد .اگر استسنائي شناسائي نشود، خطائي مختل ‎كننده ويا پيغام غيرقابل فهم دريافت ميكنيد. ‎براي درك بهتر مطلب، استنسائي ايجاد ميكنيم بدون آنكه آنرا مديريت كنيم.

‎‎مثال ـ در نمونه اسكريپت زير استسنا تقسيم بر صفر درست مديريت نشده است.

 <?php 
function divide($dividend, $divisor) {
  if($divisor == 0) {
    throw new Exception("Division by zero");
  }
  return $dividend / $divisor;
}

echo divide(5, 0);
?> 

--(go to editor for change code and run)

‎‎با اجراي مثال خطاي زيرا خواهيم داشت و اسكريپت غير منتظره متوقف ميشود،كه توقف عادي نيست.

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 

‎بااين اصلاح نسبت به مثالي قبلي ، پيغام خطا تا حدي در كنترل درآمد، اما كافي نيست .برعكس ‎اين روش كنترل باعث توقف كامل برنامه ميشود .بعبارتي اگر دستوراتي ديگري هم وجود داشت ‎اجرا نميگرديد .توقف ويا تداوم اجرا هنگام برخورد با خطا ، مناسب تراست تحت كنترل باشد.

‎‎دستورtry ...catch

‎براي جلوگيري از حطاي مثال بالا ميتوانيم از دستور‎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.";
}
?> 

--(go to editor for change code and run)

‎در مثال بالا در بلوكcatch نشان ميدهد كه چه نوع استسنا بايد گرفته شود،و نام متغير براي ‎دسترسي به مشخصات استسنا .در اين مثال نام استسنا‎Excepion‎ ونام متغير ‎$e‎‎ميباشد .

‎‎دستورtry...catch...finally -‎

‎‎فرمت كلي درستور مطابق زيراست.

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.";
}
?>

--(go to editor for change code and run)

‎‎شئ استسناThe Exception Object -‎

‎شئ استسنا داراي اطلاعاتي از خطاي رخ داده ورفتار تابع در برخورد با استسنا داشته كه ميتوان ‎استفاده نمود .فرمت كلي ايجاد شئ مطابق زير است.

‎new Exception(message,code,previous)‎

‎‎مقادير پارامترهاي دستور مطابق دو جدول زير است.

‎‎ ‎‎ ‎‎ ‎‎
پارامتر شرح
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";
}
?> 

--(go to editor for change code and run)


Previous >    <Next