استثناها (Exceptions)
«استثنا (Exception)» یعنی شیئی برای توصیف خطاهای غیرمنتظره. در «استثنا در PHP» می توانیم خطا را پرتاب کنیم و کنترل برنامه را امن نگه داریم. مثل بازی که خطا می دهد و سریع منو برمی گردد.
استثنا در PHP چیست؟
استثنا توسط تابع ها و کلاس ها پرتاب می شود. همچنین، توابع خودمان هم می توانند استثنا پرتاب کنند. این کار جلوی ادامه وضعیت خراب را می گیرد.
پرتاب استثنا با throw
عبارت throw یک استثنا می سازد و پرتاب می کند. بعد از آن کد اجرا نمی شود.
<?php
function divide($dividend, $divisor) {
if ($divisor == 0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
echo divide(5, 0);
?>
هشدار: اگر استثنا را نگیری، خطای «Uncaught Exception» رخ می دهد.
مدیریت استثنا: try...catch
با try...catch استثنا را می گیریم و پیام مناسب نشان می دهیم. سپس برنامه ادامه می دهد.
<?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 نوع استثنا و نام متغیر را مشخص می کنیم؛ اینجا $e.
بلوک finally؛ همیشه اجرا می شود
با finally کدی را همیشه اجرا می کنیم؛ چه استثنا گرفته شود یا نشود.
<?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.";
}
?>
<?php
function divide($dividend, $divisor) {
if ($divisor == 0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} finally {
echo "Process complete.";
}
?>
شیء Exception و اطلاعات خطا
شیء Exception جزئیات خطا را دارد؛ مثل پیام، کد، فایل و خط. این اطلاعات برای گزارش خطا عالی است.
<?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]<br> $message";
}
?>
جمع بندی سریع
- throw برای پرتاب استثنا استفاده کن.
- try...catch جلوی کرش ناگهانی را می گیرد.
- finally همیشه اجرا می شود.
- از getMessage و getCode برای گزارش استفاده کن.
- استثنا در PHP مدیریت خطا را تمیز می کند.