PHP – استثنائات (Exceptions)

PHP و استثنائات

استثناء (Exception) در PHP، شیئی است که برای توصیف یک خطا یا رفتار غیرمنتظره در اسکریپت PHP استفاده می‌شود. استثنائات می‌توانند توسط بسیاری از توابع و کلاس‌های PHP پرتاب شوند و همچنین توابع و کلاس‌های تعریف شده توسط کاربر نیز می‌توانند استثنائات را پرتاب کنند.

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

پرتاب یک استثناء

بیان throw به یک تابع یا متد اجازه می‌دهد که یک استثنا را پرتاب کند. زمانی که یک استثنا پرتاب می‌شود، کد بعد از آن اجرا نخواهد شد.

اگر استثنا به درستی مدیریت نشود، یک خطای کشف نشده (Uncaught Exception) به وقوع می‌پیوندد.

مثال: پرتاب استثنا بدون مدیریت

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

خروجی:

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

برای جلوگیری از خطاهای مثال بالا، می‌توانیم از دستور try...catch استفاده کنیم تا استثنائات را مدیریت کرده و فرآیند را ادامه دهیم.

سینتکس:

try {
  // کدی که ممکن است استثنا پرتاب کند
} catch(Exception $e) {
  // کدی که هنگام برخورد با استثنا اجرا می‌شود
}

مثال: نمایش پیام هنگام پرتاب استثنا

<?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 مشخص می‌شود که چه نوع استثنایی باید مدیریت شود و نام متغیری که می‌تواند برای دسترسی به استثنا استفاده شود. در مثال بالا، نوع استثنا Exception و نام متغیر $e است.

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

دستور try...catch...finally برای مدیریت استثنائات استفاده می‌شود. کد در بلوک finally همیشه اجرا می‌شود، چه استثنا کشف شده باشد یا خیر. اگر finally موجود باشد، بلوک catch اختیاری است.

سینتکس:

try {
  // کدی که ممکن است استثنا پرتاب کند
} catch(Exception $e) {
  // کدی که هنگام برخورد با استثنا اجرا می‌شود
} 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 Object)

شیء استثنا حاوی اطلاعاتی درباره خطا یا رفتار غیرمنتظره‌ای است که تابع با آن مواجه شده است.

سینتکس:

new Exception(message, code, previous)

پارامترها:

  • message: (اختیاری) رشته‌ای که توضیح می‌دهد چرا استثنا پرتاب شده است.
  • code: (اختیاری) عدد صحیحی که می‌تواند برای تمایز این استثنا از دیگر استثنائات از همان نوع استفاده شود.
  • previous: (اختیاری) اگر این استثنا در یک بلوک catch دیگر پرتاب شده باشد، توصیه می‌شود که آن استثنا را به این پارامتر ارسال کنید.

روش‌ها:

زمانی که استثنا را مدیریت می‌کنید، می‌توانید از متدهای زیر برای دریافت اطلاعات درباره استثنا استفاده کنید:

  • getMessage(): رشته‌ای را برمی‌گرداند که توضیح می‌دهد چرا استثنا پرتاب شده است.
  • getPrevious(): اگر این استثنا توسط استثنای دیگری ایجاد شده باشد، این متد استثنای قبلی را برمی‌گرداند. در غیر این صورت، null برمی‌گرداند.
  • 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";
}
?>

پست های مرتبط

مطالعه این پست ها رو از دست ندین!
Python - محدود کردن داده (MongoDB Limit)

Python – محدود کردن داده (MongoDB Limit)

Python MongoDB محدود کردن نتایج برای محدود کردن نتایج در MongoDB، از متد limit() استفاده می‌کنیم. متد limit() یک...

بیشتر بخوانید
Python - بروزرسانی (MongoDB Update)

Python – بروزرسانی (MongoDB Update)

به‌روزرسانی یک رکورد برای به‌روزرسانی یک رکورد یا سند در MongoDB، از متد update_one() استفاده می‌کنیم. پارامتر اول متد...

بیشتر بخوانید
Python - حذف کالکشن (MongoDB Drop Collection)

Python – حذف کالکشن (MongoDB Drop Collection)

حذف کالکشن شما می‌توانید یک جدول یا کالکشن در MongoDB را با استفاده از متد drop() حذف کنید. مثالحذف...

بیشتر بخوانید

نظرات

سوالات و نظراتتون رو با ما به اشتراک بذارید

برای ارسال نظر لطفا ابتدا وارد حساب کاربری خود شوید.