میخوای وارد بازار کار بشی و محصولات خودت رو بفرشی همین الان ثبت نام کن
0

استثنا در php

استثنا چیست؟

یک استثنا شی ای است که یک خطا یا یک رفتار غیرمنتظره از یک اسکریپت PHP را توصیف می کند.

بسیاری از توابع و کلاسهای PHP استثنائات را نشان می دهند.

توابع و کلاسهای تعریف شده توسط کاربر همچنین می توانند موارد استثنائی را ایجاد کنند.

موارد استثنا روش خوبی برای متوقف کردن عملکرد در هنگام مواجهه با داده هایی است که قادر به استفاده از آنها نیست.

 

این اتفاقات معمولا هنگامی که یک استثنا رخ می دهد، می افتند:

  • وضعیت کد ذخیره می شود
  • کد اجرایی به یک تابع سفارشی مدیریت استثنا سویچ می کند
  • بسته به وضعیت، مدیریت کننده ممکن است اجرای وضعیت کد ذخیره شده را از سر بگیرد، اسکریپت استثنا را متوقف کند و یااسریکپت را از محل متفاوتی ادامه دهد

 

در ادامه با روش های مختلف مدیریت استثنا آشنا خواهید شد:

  • استفاده اصلی استثنا ها
  • ساخت یک مدیریت کننده استثنا سفارشی
  • استثنا های چندگانه
  • پرتاب مجدد استثنا
  • تنظیم یک مدیریت کننده استثنا سطح بالا

 

استفاده اصلی استثنا ها

وقتی یک استثنا رخ می دهد(پرتاب می شود)، ادامه کد اجرا نمی شود و php تلاش می کند تا بلوک “catch” متناظر را پیدا کند.

اگر یک استثنا گرفته نشود، یک خطا جدی با پیام “Uncaught Exception” ظاهر می شود.

بیاید یک استثنا را بدون گرفتنش راه اندازی کنیم:

مثال : 

<?php
//create function with an exception
function checkNum($number) {
if($number>1) {
throw new Exception(“مقدار باید ۱ یا کتر باشد”);
}
return true;
}

//trigger exception
checkNum(2);
?>

 

خروجی کد به شکل زیر می باشد:

مثال : 
Fatal error: Uncaught exception ‘Exception’
with message ‘مقدار باید ۱ یا کتر باشد’ in C:\webfolder\test.php:6
Stack trace: #0 C:\webfolder\test.php(12):
checkNum(28) #1 {main} thrown in C:\webfolder\test.php on line 6

 

try و catch

برای جلوگیری از رخ دادن خطا بالا باید کدی فراهم کنیم تا استثنا را مدیریت کند.

این کد باید شرایط زیر را داشته باشد:

try – تابعی که دارای یک استثنا است باید در بلوک try قرار بگیرد. اگر استثنا رخ نداد، کد به طور معمول اجرا می شود.

throw – راه اندازی یک استثنا را انجام می دهد. هر throw باید یک catch داشته باشد

catch – یک بلوک catch به رسیدگی به استثنا می پردازد. شامل شئی (object) می باشد که پیام خطا را در خود دارد.

 

<?php
//create function with an exception
function checkNum($number) {
if($number>1) {
throw new Exception(“مقدار باید ۱ یا کتر باشد”);
}
return true;
}

//trigger exception in a “try” block
try {
checkNum(2);
//If the exception is thrown, this text will not be shown
echo ‘مقدار برابر یک یا بیشتر است’;
}

//catch exception
catch(Exception $e) {
echo ‘Message: ‘ .$e->getMessage();
}
?>

خروجی به شکل زیر می باشد:

مثال : 

ساخت یک کلاس استثنا

برای ساخت یک مدیریت کننده سفارشی باید یک کلاس خاص ایجاد کنید که توابعی داشته باشد تا بتوانند در هتگام رخ دادن استثنا فراخوانده شوند. کلاس شما باید از کلاس Exception ارث ببرد.

کلاس سفارشی ما پروپرتی ها (متغیر) کلاس Exception را به ارث می برد که می توانید آن ها را در کلاس خود استفاده کنید.

کد ساخت کلاس:

مثال : 

<?php
class customException extends Exception {
public function errorMessage() {
//error message
$errorMsg = ‘Error on line ‘.$this->getLine().’ in ‘.$this->getFile()
.’: <b>’.$this->getMessage().'</b> is not a valid E-Mail address’;
return $errorMsg;
}
}

$email = “someone@example…com”;

try {
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
//throw exception if email is not valid
throw new customException($email);
}
}

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

کلاس جدید یک کپی از کلاس قدیمی exception به علاوه یک تابع ()errorMessage هست.چون که این کلاس یک کپی هست و متغیر ها و متد ها (تابع) را به ارث می برد، ما می توانیم از توابعب مثل ()getLine و ()getFile و ()getMessage استفاده کنیم.

 

استثنا های چندگانه

این امکان وجود دارد که از چندین استثنا برای شرایط مختلف استفاده کنیم.

 

 

توضیح مثال بالا:

کد بالا دو شرط را آزمایش می کند و اگر هیچ کدام از شرط ها برقرار نباشد یک استثنا پرتاب می کتد.

کلاس ()customException به عنوان یک استثنا کلاس exception قدیمی ساخته شده است. از این طریق از تمام متغیر ها و توابع کلاس قدیمی ارث بری می کند.

تابع ()errorMessage یک پیغام خطا بر می گرداند اگر آدرس ایمیل نامعتبر باشد

متغیر email$ برای یک رشته آدرس ایمیل معتبر تنظیم شده اما مقدار رشته “example” را دارد

بلوک try اجرا شده و در اولین شرط استثنا پرتاب نشده است

دومین شرط یک استثنا را پرتاب خواهد کرد زیرا آدرس ایمیل معتبر نیست

بلوک catch استثنا را گرفته و پیغام خطا را نمایش می دهد

 

راه اندازی مجدد استثنا

گاهی اوقات وقتی یک استثنا راه اندازی می شود، ممکن است شما بخواهید که آن را از متفاوت از روش استاندارد مدیریت کنید.
این امکان وجود دارد تا استثنا یک بار دیگر در بلوک catch پرتاب شود.

یک اسکریپت باید خطا سیستم را از دید کاربران مخفی نگه دارد. ممکن است که خطا های سیسم برای برنامه نویس مهم باشد اما برای کاربران جالب نیستند.
برای اینکه کاربر راحت باشد می توانید استثنا را با یک پیام بهتر و مورد پسند تر مجددا رتاب کنید:

مثال : 

 

تنظیم یک مدیریت کننده استثنا سطح بالا

تابع ()set_exception_handler یک تابع کاربرساز را برای مدیریت استثنا های گرفته نشده تنظیم می کند:

مثال : 

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

set_exception_handler(‘myException’);

throw new Exception(‘Uncaught Exception occurred’);
?>

خروجی کد بالا:

 

قوانینی برای استثنا ها

ممکن است مد برای گرفتن استثنا های احتمالی در یک بلوک try احاطه شده باشد

هر بلوک try باید حداقل یک یک بلوک catch متناظر داشته باشد

چندین بلوک catch می توانند برای گرفتن استثنا های کلاس های مختلف استفاده شوند

استثنا ها می توانند در یک بلوک catch داخل بلوک try پرتاب ( یا پرتاب مجدد) شوند

 

یک قانون ساده: اگر چیزی را پرتاب کردید، باید آن را بگیرید.

 

 


 

نظراتتون رو زیر همین پست با ما به اشتراک بگذارید.

 

ارسال دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

×

سلام کاربر عزیز

هر سوالی دارید در این بخش هستیم تا شما رو راهنمائی کنیم

روی لوگومون کلیک کنید

× چطور میتونم کمکتون کنم؟