استثناها برای تغییر جریان طبیعی یک اسکریپت هنگام وقوع یک خطای مشخص، استفاده می شوند.
استثنا چیست؟
استثناها یک روش شی گرا و جدید برای مقابله با خطاها است که با پی اچ پی 5 ارائه شده است.
پردازش استثنا، برای تغییر جریان عادی اجرای کد مورد استفاده قرار می گیرد اگر یک خطای خاص (استثنایی) رخ دهد. که این وضعیت، استثناء(exception) نامیده می شود.
معمولا زمانی که یک استثنا ایجاد شود، موارد زیر انجام می شود:
- وضعیت کد کنونی ذخیره می شود.
- اجرای کد به یک تابع پردازشگر استثناء (سفارشی) منتقل می شود.
- بسته به وضعیت، مدیر استثنا ممکن است پس از اجرای وضعیت ذخیره شده کد را از سر بگیرد، اجرای اسکریپت را خاتمه دهد یا اسکریپت را از یک مکان دیگر در کد ادامه دهد.
در این آموزش، روش های مختلف خطا را نشان می دهیم:
- استفاده عمومی از استثنائات
- ایجاد یک handler جداگانه سفارشی
- استثناء چندگانه
- دوباره پرتاب یک استثنا
- تنظیم کننده پردازشگر استثنای سطح بالا
نکته: استثنا ها فقط باید با شرایط خطا مورد استفاده قرار گیرد و نباید برای پریدن به مکان دیگری در کد در یک نقطه مشخص مورد استفاده قرار گیرد.
استفاده عمومی از استثنائات
هنگامی که یک استثنا پرتاب می شود، کد زیر آن اجرا نخواهد شد و PHP سعی خواهد کرد بلوک “catch” مربوطه را پیدا کند. ولی اگر یک استثنا دستپیر نشود، یک خطای مهلک با پیام “Exception Excluded” صادر می شود.
بیایید سعی کنیم یک استثنا بدون دستگیری آن ایجاد کنیم :
<?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 – یک تابع با استفاده از یک استثنا در بلوک «try» باشد. اگر استثنا عمل نکند، کد به صورت طبیعی ادامه خواهد یافت. با این حال اگر استثنا تریگر شود، یک استثنا “throw” خواهد شد.
throw – این است که یک استثنا را باعث می شود. هر ” throw ” باید حداقل یک “catch” داشته باشد.
catch – یک بلوک ” 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 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
توضیح مثال فوق
کد بالا یک استثناء را ایجاد می کند و آن را دستگیر می کند:
تابع checkNum ایجاد می شود تا بررسی کند که یک عدد بزرگتر از 1 هست یا خیر؟ اگر بزرگتراز 1 بود، یک استثنا ایجاد می شود.
تابع checkNum بلاک “try” نامیده می شود.
استثنا در تابع checkNum ایجاد(throw) می شود
بلوک “catch” استثنا را بازیابی می کند و یک شی $e) حاوی اطلاعات استثنا ایجاد می کند.
پیام خطا از استثنا با فراخوانی $e-> getMessage از شیء استثنایی نمایش داده می شود.
با این حال برای دور زدن قانون “هر throw باید یک catch” داشته باشد، تنظیم مدیر استثنای سطح بالا است.