
آموزش مدیریت استثناها - Exception در PHP
با استفاده از فیلم های آموزشی تولید شده توسط کلیک سایت، به راحتی می توانید آموزش مدیریت استثناها - Exception در PHP را آموزش ببینید. در ادامه دعوت می شود که فیلم دمو (بخش اول آموزش) را در زیر مشاهده نمایید.
اگر یک خطای خاصی رخ داده باشد، استثناها (Exception) برای تغییر جریان طبیعی یک اسکریپت استفاده می شوند.
استثنا (Exception) چیست؟
همراه با php5 یک روش شی گراییِ جدید (object oriented) برای مقابله با خطاها ارائه داده شد. این روش بدین صورت است که ، اگر خطای خاص و استثنایی (exceptional) رخ دهد، مدیریت خطاها (Handling Exception) روندِ عادیِ اجرایِ کد، را تغییر می دهد. این خطا را می توان با دستورات شرطی (Condition) مشخص کرد. به این شرط، استثناء یا Exception می گویند.
وقتی یک استثنا راه اندازی می شود چنین چیزهایی اتفاق می افتد:
- وضعیت کنونی کد، ذخیره می شود.
- ادامه ی اجرای کد به یک تابع دلخواه (سفارشی) و تعیین شده، که استثنا را مدیریت می کند، منتقل می شود.
- بسته به وضعیت، ممکن است، بررسی کننده استثنا یا handler اجرای کد را از نقطه ای که کد را ذخیره کرده است از سر بگیرد یا به اجرای اسکریپت خاتمه دهد یا اسکریپت را از یک مکان دیگر در کد ادامه دهد.
در این آموزش متدهای مختلف مدیریت خطا (error handling) آموزش داده شده است. این متدها بدین قرار هستند :
- نحوه استفاده ساده از استثناها
- ساخت مدیریت کننده سفارشی برای استثناها (custom exception handler)
- استثناهای چندگانه (Multiple exceptions)
- راه اندازی مجدد یک استثنا (Re-throwing an exception)
- تعیین یک مدیریت سطح بالا برای استثناها (top level exception handler)
نکته: از استثناها فقط باید زمانی استفاده کرد، که خطایی رخ می دهد . و نباید برای پرش از نقطه ای به نقطه ی خاصی در کد استفاده نمود.
نحوه ساده (basic) استفاده از استثناها (Exceptions) :
هنگامی که یک استثنا رخ داده می شود، کدهای بعد از آن اجرا نخواهد شد و PHP سعی خواهد کرد بلوک تطابقی استثنای مذکور که "catch" نامیده می شود را پیدا کند.
اگر php برای یک استثنا، بلاک تطابقی آنرا نیابد، یک fatal error (خطای مهلک)، همراه با پیغام "Uncaught Exception" یعنی "استثنا یافت نشد" را صادر می کند.
در کد زیر، یک exception را در برنامه ایجاد کرده ایم، بدون این که آن را ردگیری کنیم یعنی بدون آنکه برای آن بلوک Catch تعریف نماییم :
<?php
//create function with an exception
function checkNum($number) {
if($number>1) {
throw new Exception("Value must be 1 or below");
}
return true;
}
//trigger exception
checkNum(2);
?>
کد بالا یک خطایی مثل این خواهد داشت:
Fatal error: Uncaught exception 'Exception'
with message 'Value must be 1 or below' 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» باشد. اگر استثنا اجرا نشود، فرآیند اجرای کد به صورت معمول ادامه خواهد یافت. اما اگر استثنا اجرا شود، در اصطلاح می گوییم که آن استثنا پرتاب یا thrown شده است.
Throw – بخش "throw" مشخص می کند، که چگونه شما یک استثنا را راه اندازی می کنید. هر “throw” بایستی حداقل یک بخش “catch” داشته باشد.
Catch - بلاک “Catch” استثنای رخ داده شده را می گیرد و یک شیء "$e" حاوی اطلاعات Exception را ایجاد می کند.
اجازه دهید تا یک استثنا را با کد معتبر راه اندازی کنیم:
<?php
//create function with an exception
function checkNum($number) {
if($number>1) {
throw new Exception("Value must be 1 or below");
}
return true;
}
//trigger exception in a "try" block
try {
checkNum(2);
//If the exception is thrown, this text will not be shown
echo 'If you see this, the number is 1 or below';
}
//catch exception
catch(Exception $e) {
echo 'Message: ' .$e->getMessage();
}
?>
کد بالا یک خطایی مثل این خواهد داشت:
Message: Value must be 1 or below
توضیح مثال بالا:
کد بالا یک استثناء را فعال می کند و آن را دریافت (catch) می کند:
- تابع ()checkNum بررسی می کند آیا عدد بزرگتر از 1 است. اگر بزرگتر از 1 است یک استثنا پرتاب (throw) می کند
- تابع ()checkNum درون بلاک "try" فراخوانی می شود
- استثنا داخل تابع checkNum() پرتاب می شود
- بلوک "catch" استثناهای پرتاب شده را می گیرد و یک شی ($e) حاوی اطلاعات استثناها ایجاد می کند
- پیام خطای استثنا با فراخوانی $e->getMessage() از شیء استثنا فراخوانی می شود
با این حال، یک راه برای دور زدنِ قانون "هر throw باید یک catch داشته باشد" وجود دارد و آن هم طراحی یک مدیریت استثنای سطح بالاست، که در ادامه به آن می پردازیم.
ایجاد یک کلاس استثنا سفارشی (Custom Exception Class)
برای ایجاد یک کلاس استثنای سفارشی، شما باید یک کلاس خاص با توابعی ایجاد کنید که وقتی یک استثنا در PHP فعال می شود، آنها فراخوانی شوند. این کلاس باید یک زیرمجموعه یا فرزند از کلاس اصلی exception class در PHP باشد.
کلاسِ استثنا دلخواه یا سفارشی تان، خواص (properties) را از کلاس اصلی PHP Exception Class به ارث می برد و شما می توانید توابع دلخواهتان را به آن اضافه کنید.
اجازه دهید یک کلاس استثنا سفارشی ایجاد کنیم :
<?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 = " clicksite.ir@gmail...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();
}
?>
خروجی :
Error on line 17 in C:\wamp64\www\cod\index.php: clicksite.ir@gmail...com is not a valid E-Mail address
کلاس جدید یک نسخه از کلاس exception class قدیمی است که به آن تابع errorMessage را اضافه نموده ایم. از آنجا که کلاس جدید، یک کپی از کلاس قدیمی است و خواص و متدها (properties and methods) را از کلاس قدیمی به ارث می برد، می توانیم از متدهای کلاس استثنای قدیمی، مانند getLine () و getFile () و getMessage () استفاده کنیم.
توضیح مثال بالا:
کد بالا یک استثنا را پرتاب(throw) می کند و این استثنا توسط کلاس استثنایی که خودمان تعریف نموده ایم، گرفته میشود(catch).
- کلاس customException به عنوان توسعه یافته ی کلاس استثنای قدیمی exception class می باشد. به این ترتیب تمام متد ها و خواص را از کلاس استثنای قدیمی به ارث می برد.
- تابع خطای پیام (errorMessage) ایجاد شده است تا اگر یک آدرس ایمیل، نامعتبر(invalid) باشد، این تابع یک پیام خطا را نشان دهد.
- متغیر $email به یک رشته است که در اینجا حاوی یک آدرس ایمیل نامعتبر می باشد.
- بلوک دستوری “try” اجرا شده و از آنجایی که ایمیل متغیر $email معتبر نیست، استثنا تعیین شده اجرا می شود.
- بلوک “catch”، استثنا رخ داده را می گیرد و پیام خطا را نمایش می دهد.
استثنا چندگانه (Multiple Exceptions) :
ممکن است یک اسکریپت از چندین استثناء(multiple exceptions) استفاده کند تا چندین شرایط(multiple conditions) را بررسی کند.
همچنین می توانید از چندین بلوک if..else، یا یک switch یا استثناء چندگانه (multiple exceptions) استفاده کنید.
این استثنائات می توانند از کلاس های استثنای مختلفی (exception classes) استفاده کنند و پیام های خطای مختلف را برگردانند.
<?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 = "clicksite.ir@gmail.com";
try {
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
//throw exception if email is not valid
throw new customException($email);
}
//check for "gmail" in mail address
if(strpos($email, "gmail") !== FALSE) {
throw new Exception("$email is an gmail e-mail");
}
}
catch (customException $e) {
echo $e->errorMessage();
}
catch(Exception $e) {
echo $e->getMessage();
}
?>
خروجی:
clicksite.ir@gmail.com is an gmail e-mail
توضیح مثال:
- کد بالا دو شرط(condition) را چک می کند و اگر هر کدام از شرط ها برقرار نبود، یک استثناء صادر می کند.
- کلاس customException() به عنوان یک مدل توسعه یافته ی کلاس استثنای قدیمی (old exception class) می باشد. به این ترتیب تمام متد ها و خواص (methods and properties) را از کلاس exception قدیمی به ارث می برد.
- تابع errorMessage() بررسی می کند، اگر یک آدرس ایمیل نامعتبر باشد، این تابع یک پیام خطا را نشان دهد.
- متغیر $email به یک رشته است که حاوی یک آدرس ایمیل معتبر می باشد که این آدرس ایمیل حاوی رشته "gmail" است.
- بلوک "try" اجرا می شود و چون شرط if برقرار نمی شود بنابراین extension پرتاب (throw) نمی شودیا به عبارتی روی نمی دهد.
- بلوک "try" اجرا می شود و حالت دوم باعث ایجاد استثنا می شود زیرا ایمیل حاوی رشته "gmail" است.
- بلوک "catch" استثنا را دریافت می کند و پیام خطای درست را نمایش می دهد
- اگر استثنای پرتاب شده از کلاس دلخواه و سفارشی مان customException() باشد و بلوک catch ی برای این استثنا نداشته باشیم و فقط بلوک catch برای Exception پایه را داشته باشیم، بلوک "catch" پایه ، استثنا را دریافت می کند و پیام خطای درست را نمایش می دهد. به مثال زیر دقت کنید.
<?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 = "clicksite.ir@gmail...com";
try {
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
//throw exception if email is not valid
throw new customException($email);
}
//check for "example" in mail address
if(strpos($email, "gmail") !== FALSE) {
throw new Exception("$email is an gmail e-mail");
}
}
catch(Exception $e) {
echo $e->getMessage();
}
?>
خروجی:
clicksite.ir@gmail...com
ارسال مجدد استثنا (Re-throwing Exception)
گاهی اوقات، هنگامی که یک استثنا پرتاب می شود، ممکن است بخواهید آن را به طور متفاوتی از آنچه استاندارد است، اداره کنید. این کار را می توانید، با پرتابِ مجددِ یک استثنا از یک بلوک «catch» عملی نمایید. اسکریپتی که یک برنامه نویس می نویسید، باید اشتباهات برنامه را از دید کاربران پنهان کند.خطاهای سیستم ممکن است برای برنامه نویس مهم باشداما دیدن آنها برای کاربران معمولی جالب و جذاب نیست.
برای این کار لازم است که برنامه نویس استثناها را با یک پیغام دوستانه، دوباره پرتاب کند(re-throw the exception):
<?php
class customException extends Exception {
public function errorMessage() {
//error message
$errorMsg = $this->getMessage().' is not a valid E-Mail address.';
return $errorMsg;
}
}
$email = "clicksite.ir@gmail...com";
try {
try {
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
//throw exception if email is not valid
throw new Exception($email);
}
}
catch(Exception $e) {
//re-throw exception
throw new customException($email);
}
}
catch (customException $e) {
//display custom message
echo $e->errorMessage();
}
?>
خروجی :
clicksite.ir@gmail...com is not a valid E-Mail address.
توضیح مثال :
- کلاس customException() به عنوان یک مدل توسعه یافته ی کلاس استثنای قدیمی (old exception class) می باشد. به این ترتیب تمام متد ها و خواص (methods and properties) را از کلاس exception قدیمی به ارث می برد.
- تابع errorMessagE() بررسی می کند، اگر یک آدرس ایمیل نامعتبر باشد، این تابع یک پیام خطا را نشان دهد.
- متغیر $email به یک رشته است که در اینجا حاوی یک آدرس ایمیل نامعتبر می باشد.
- بلوک "try" حاوی بلوک دیگری از "try" است تا بتواند استثنا را دوباره پرتاب کند.
- وقتی ایمیل نامعتبر است استثنا به سمت کلاس Exception پرتاب می شود.
- بلوک "catch" استثنا را دریافت می کند و دوباره به سمت کلاس "customException" پرتاب می کند.
- "customException" اجرا می شود و پیام خطایی را نمایش می دهد.
اگر خطا یا exception در بلوک “try” جاری آن گرفته نشود، برنامه به دنبال دریافت آن در بلوک “catch” و یا مراتب بالاتر خواهد گشت.
تنظیم یک مدیریت کننده استثنا سطح بالا (Top Level Exception Handler) :
تابع set_exception_handler() نامِ یک تابعِ تعریف شده توسط کاربر را می گیرد.و از آن برای همه استثناهایی که بلوک catch برایشان تعریف نشده است استفاده می کند.
<?php
function myException($exception) {
echo "<b>Exception:</b> " . $exception->getMessage();
}
set_exception_handler('myException');
throw new Exception('Uncaught Exception occurred');
?>
خروجی:
Exception: Uncaught Exception occurred
در کد بالا هیچ بلوک "catch" ی وجود نداشت. در عوض یک مدیریت کننده exception سطح بالا(top level exception handler) تعریف شده بود.exception ما بلوک catch نداشت، این تابع برای استثاهایی که برایشان بلوک "Catch" تعریف نشده مورداستفاده قرار می گیرد.
قوانین مربوط به exception
- کدها را معمولا در بلوک های "try" قرار می دهیم تا به "catch" یا گرفتن exceptionهای احتمالی کمک نماییم.
- هر بلاک "try" یا "throw" باید حداقل یک بلاک "catch" متناظر داشته باشد.
- از بلوک های "catch" چندگانه می توان برای گرفتن کلاس های مختلف استثنا (classes of exceptions) استفاده شود
- Exception ها می توانند در یک بلوک "catch" داخل یک بلوک "try"پرتاب شوند (یا دوبار پرتاب شوند)
- یک قاعده ساده: اگر چیزی را پرتاب (throw) کنید، باید آن را بگیرید (catch).
این فصل در یک نگاه:
در این مجموعه به ساخت سیستم نظردهی در php می پردازیم.…
بنا به درخواست یکی از کاربران گرامی سایت (امیر تجاره) طی چند مجموعه آموزشی قصد داریم نحوه ساخت و پیاده سازی سیستم ثبت نظرات و هم چنین نحوه ثبت پاسخ به هر نظر را مورد بررسی قرار دهیم. این مج…این فصل در یک نگاه:
در این مجموعه به آموزش ارسال ایمیل در phpmailer می پردازیم.یکی از مزایای phpmailer و ارسال ایمیل در php با استفاده از ph…
بی شک ارسال ایمیل php از مهم ترین توانایی های یک برنامه نویس php به شمار می رود. این ایمیل می تواند برای تبلیغات و یا اطلاع رسانی و موارد بسیار زیادی به کار رود. در php روش های مختلفی برای…این فصل در یک نگاه:
در این فصل به معرفی پایگاه داده می پردازیم و با مفهوم دیتابیس و پایگاه های داده آشنایی پیدا می کنیم.…
آیا اصلا من میتونم یک طراح سایت و برنامه نویس بشم؟ آیا یادگیری طراحی سایت سخته ؟ آیا باید حتما زبان انگلیسی رو مسلط باشم؟ آیا حتما نیاز هست که رشته کامپیوتر باشم ؟ آیا یادگیری برنامه نویسی …این فصل در یک نگاه:
در این فصل با زبان سمت سرور PHP آشنا می شویم و توابع و دستورات مهم این زبان برنامه نویسی را بررسی خواهیم کرد…
بنام خدا با سلام خدمت تمامی دوستان عزیز کلیک سایت. بسیار خرسندیم که با یک دوره پروژه محور دیگر در خدمت شما دوستان محترم هستیم که انشالله قرار است قدم بگذاریم به دنیای بسیار جذاب و مح…این فصل در یک نگاه:
در این فصل می آییم یک سایت بلاگ با cms اختصاصی را پیاده سازی می کنیم که هم مروری باشه برای زبان برنامه نویسی PHP و هم شم…
توجه: این دوره دائما توسط مهندس روشنایی (مدرس دوره) بروز گردیده و مطابق با آخرین استانداردهای برنامه نویسی آپدیت می شود. توجه فرمائید دریافت آپدیت ها برای خریداران قبلی رایگان می باشد و نیاز…این فصل در یک نگاه:
آشنایی با دستورات html ، css و js و انجام مینی پروژه سامانه نمرات دانش آموزان مدرسه آلفا…
توضیحات کلی مجموعه: در این دوره به مفاهیم و توابع php و mysql پرداخته شده و این دوره منتج به تولید یک پروژه بزرگ نخواهد شد در پایان این دوره یک مینی پروژه مثل سامانه کارنامه دانش آموزان مدر…این فصل در یک نگاه:
وب سایت فروشگاهی خود را بدون دانش برنامه نویسی و بدون پیش نیاز طراحی کنید.فروشگاه اینترنتی با افزونه ووکامرس که به شهرت …
راه اندازی فروشگاه اینترنتی در وردپرس با افزونه ووکامرس آموزش حرفه ای فروشگاه ساز وردپرس با افزونه ووکامرس آخرین باز تولید آموزش ویدیویی ووکامرس در 1396/11/15 صورت گرفت. …این فصل در یک نگاه:
…
سلام . پیشنهاد میکنم حتما دموی دوره رو مشاهده کنید درباره فریم ورک Yii: در پاسخ به سوالات : آیا این فریم ورک سریع است؟ آیا این یک فریم ورک امن است؟ آیا این یک فریم ورک حرفه ای است؟ آیا ا…این فصل در یک نگاه:
آشنایی با امکانات جدید لاراول ۷…
برخی از سرفصل های این پکیج آموزشی : لاراول چیست و چرا ما لاراول استفاده میکنیم کامپوزر کارش چیه و نصب اون نصب لاراول آموزش نصب لاراول از طریق اینستالر آموزش نصب لاراول با استفاده ا…این فصل در یک نگاه:
داشتن یک اپلیکیشن موبایل برای وب سایت به برند سازی و اعتبار وب سایت بهبود و تسریع می بخشد لذا توصیه می شود با وجود همگان…
دوره آموزش طراحی و ساخت اپلیکیشن موبایل برای وب سایت قطعا شما هم دوست دارید برای وب سایت خود اپلیکیشن بسازید و پس از پیگیری متوجه شدید که هزینه ای بیش از 5.000.000 تومان باید پرداخت بکن…این فصل در یک نگاه:
در اصل فصل در مورد performance صحبت خواهیم کرد :-React Performance-Lazy-Error Boundaries و سایت را بر روی هاست واقعی قرا…
با سلام خدمت کلیک سایتی های عزیز، به دوره ی صفر تا صد طراحی سایت با react js خوش آمدید. نکته:این دوره کاملا پروژه محور میباشد نکته:این دوره هیچ پیش نیازی ندارد ReactJS چیست؟ ReactJS اس…این فصل در یک نگاه:
در این فصل(فصل یازدهم مجموعه)،به طراحی CMS (سیستم مدیریت محتوا)اختصاصی فروشگاه می پردازیم.هدف از طراحی این بخش،آنست که م…
در این مجموعه آموزشی قصد داریم از صفر تا صد طراحی یک فروشگاه اینترنتی رو به صورت کامل آموزش بدهیم.این فروشگاه شامل تمامی بخش های مورد نیاز یک فروشگاه اینترنتی است. هدف از این مجموعه،آموزش…این فصل در یک نگاه:
در بازاریابی نوین روش جدیدی ابداع شده که این روزا ها بسیار کسب و کارهای اینترنتی را با هزینه بسیار بسیار پایین و بازدهی …
توضیحات کلی مجموعه: (توجه: حتما با کلیک روی عکس این دوره آموزشی در بالا دمو را مشاهده کنید یا قسمت اول را رایگان دانلود کنید) در بازاریابی اینترنتی هر روز شاهد روش های جدید و استراتژی های ن…این فصل در یک نگاه:
طراحی پنل مدیریت(دسته بندی)- دسته بندی یا category - نمایش دسته های فرعی در view با ورود به یکی از دسته های اصلی و آشن…
توضیحات کلی مجموعه: این مجموعه توسط فریمورک محبوب و دوست داشتنی bootstrap و به صورت تضمینی و صفر تا صد جهت یادگیری کارآموزان عزیز ارائه گردیده و دوستانی که این دوره را به طور کامل و دقیق…این فصل در یک نگاه:
…
پیشنهاد میکنیم دمو دوره رو حتما مشاهده کنید با سلام خدمت دوستان عزیز . ابتدا عرض کنم که این دوره برای دوستانی آماده شده که میخوان وب اپلیکیشن های مدرنی رو طراحی بکنن و وارد بازار کار ط…این فصل در یک نگاه:
فصل پنجم…
توضیحات کلی مجموعه: درباره گیت: لذت پیش بردن پروژه های برنامه نویسی خود را با بهترین ورژن کنترل سیستم جهان تجربه کنید کامل ترین دوره ی آموزشی گیت و گیت هاب به همراه مثال های کاربردی گی…این فصل در یک نگاه:
ایجاد پروژه آژانس مسافرتی.....…
فصل اول: آشنایی با مبانی برنامه نویسی اندروید آشنایی با معماری برنامه های اندرویدی ساخت شبیه ساز جهت تست پروژه اندروید آشنایی با دستور Toast و حلقه for در برنامه های اندروی…این فصل در یک نگاه:
بهترین و پر بازده ترین روش تبدیل بازدیدکننده سایت به مشتری تبلیغات هدفمند و برند سازی هوشمندانه با ایمیل می باشد. ایمیل…
وبینار(سمینار آنلاین) آموزش تکنیک های ایمیل مارکتینگ اگر تا انتها این متن را مطالعه کنید نظر شما در مورد ایمیل مارکتینگ 180 درجه عوض می شود!! بر هیچکس پوشیده نیست که از سال 1972 که ای…این فصل در یک نگاه:
مباحث تکمیلی فریم ورک لاراول…
فصل اول :آموزش مقدماتی فریم ورک لاراول معرفی فریم ورک لاراول و پیشنیازهای انجام کار انجام کانفیگ های اولیه برای نصب و راه اندازی فریم ورک معرفی روش های نصب پروژه لاراولی از طریق سایت گی…این فصل در یک نگاه:
مباحث مقدماتی فریم ورک react.js…
توضیحات کلی مجموعه: فصل اول : آشنایی با مباحث مقدماتی فریم ورک react.js نصب و راه اندازی node.js و کلیه پیش نیازهای لازم نصب فریم ورک react روی لوکال و انجام تست های لازم آغاز آشنایی …