آموزش مدیریت استثنا در PHP و جلوگیری از خطا

از مدیریت استثنا در PHP برای تغییر روند اجرای برنامه در زمان بروز خطا استفاده می‌شود. در این آموزش با ساختار try catch آشنا شده و یاد می‌گیریم چطور فرآیند مدیریت خطا در PHP را انجام دهیم.

از نسخه ۵ به بعد، یک شئ (object) برای کار با خطاها به PHP اضافه شد. مشابه زبان‌های محبوب دیگر، در زمان بروز یک خطا در برنامه می‌توانیم آن را مدیریت کرده و از ایجاد مشکل در اجرای اسکریپت جلوگیری کنیم.

استثنا در PHP

به زبان ساده، استثنا (Exception) به موقعیتی گفته می‌شود که اتفاقی به صورت پیش‌بینی نشده رخ می‌دهد. یکی از ساده‌ترین مثال‌ها، موقعیتی است که در تابع تقسیم، عدد دوم صفر باشد. در حالت عادی انتظار داریم عدد دوم صفر وارد نشود، اما ممکن است وارد موقعیتی شویم که با عملیات تقسیم بر صفر مواجه شده و خطا بگیریم.

در زبان PHP می‌توانیم استثناهایی را در شرایط مورد نظر ایجاد کرده و آن‌ها را مدیریت کنیم. این استثناها ممکن است توسط خودمان در برنامه نوشته نشده باشند و با اجرای بخشی از کتابخانه دیگر با خطا در PHP مواجه شده و مجبور باشیم آن را مدیریت کنیم.

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

در مدیریت استثنای PHP با دو بلوک اصلی سروکار داریم:

  • بلوک try : که در آن سعی می‌کنیم کاری را در حالت عادی انجام دهیم اما احساس می‌کنیم ممکن است حداقل یک حالت استثنایی برای اجرای آن وجود داشته باشد.
  • بلوک catch : در صورتی که خطا یا مشکلی در اجرای بلوک try باشد، پردازش‌های این بلوک اجرا می‌شود. معمولاً در این بلوک خطای مناسبی به کاربر نمایش می‌دهیم؛ به همین خاطر ممکن است به این کار، مدیریت خطا در PHP هم گفته شود.

ایجاد استثنا در PHP

مثال ساده برای تقسیم بر صفر را در نظر بگیرید. فرض کنید در حال توسعه تابع divide(x, y) هستیم که دو عدد را گرفته و نتیجه تقسیم را چاپ می‌کند. بدون در نظر گرفتن حالت استثنا، تابع PHP زیر را داریم:

<?php
function divide($x, $y){
    echo $x / $y;
}

با فراخوانی divide(24, 3); عدد 8 در خروجی نشان داده خواهد شد. اما اگر divide(5, 0); را اجرا کنیم، با خطایی شبیه به خطای PHP در تصویر زیر مواجه می‌شویم:

خطای مدیریت نشده در PHP
خطای مدیریت نشده در PHP

می‌بینیم که PHP سعی کرده این تقسیم را انجام دهد و نتیجه INF (بی‌نهایت) را به ما بدهد. اما به دلیل اینکه این تقسیم تعریف نشده است، با خطا مواجه شده‌ایم.

اگر Warning مشابهی در صفحه نمایش داده نمی‌شود، احتمالاً تنظیمات مدیریت نمایش خطا در سیستم یا هاست شما متفاوت است. با آموزش زیر می‌توانید مدیریت نمایش خطا در PHP را انجام دهید:

مدیریت گزارش خطا در PHP

مدیریت گزارش خطا در PHP

با کلمه کلیدی throw در PHP یک استثنا ایجاد (در حقیقت پرتاب) می‌کنیم. استثنا زمانی throw می‌شود که در وضعیت غیرعادی باشیم.

در ساده‌ترین حالت، یک شی از کلاس Exception ایجاد کرده و به عنوان ورودی آن، پیام مورد نظرمان را تعریف می‌کنیم. به کد زیر دقت کنید:

<?php
function divide($x, $y){
    if ($y != 0)
	    echo $x / $y;
	else
	    throw new Exception("مقسوم علیه نمی‌تواند صفر باشد!");
}

اگر تابع جدید را با مقسوم علیه صفر فراخوانی کنم، با خطایی شبیه خطای زیر در PHP زیر مواجه می‌شویم:

Fatal error: Uncaught Exception: مقسوم علیه نمی‌تواند صفر باشد!
in home/example/sabzdanesh-exception.php:15
Stack trace:
            #0 home/example/sabzdanesh-exception.php(18): divide(5, 0)
            #1 {main} thrown in home/example/sabzdanesh-exception.php on line 15

می‌بینیم که با خطای Fatal Error (خطای مهلک در PHP) مواجه هستیم. اما پیام مورد نظر من به کاربر به درستی نمایش داده شده است.

بنا به نیازمان می‌توانیم کلاس استثنای مورد نظرمان را ایجاد کنیم. در این صورت به جای ساخت شی از کلاس Exception در پی‌اچ‌پی، یک شئ از کلاس فرزند Exception می‌سازیم. این مسئله خارج از بحث آموزش فعلی است و در آموزشی جداگانه یاد می‌گیریم چطور یک استثنای PHP بسازیم.

مدیریت استثنا در PHP

با کمک بلوک catch می‌توانیم خطای ایجاد شده در PHP را مدیریت کنیم. برای این کار کافی است محدوده‌ای از کد که ممکن است استثنا (Exception) ایجاد کند را درون بلوک try قرار می‌دهیم.

در ادامه این بلوک، بخش catch را تعریف می‌کنیم. برای تعریف این بلوک، باید یک نوع ورودی برای آن تعیین شود. در اینجا، یک شئ از نوع Exception به نام $e تعیین می‌کنیم تا هر نوع خطایی را مدیریت کند.

در بلوک catch صرفاً پیام استثنا را چاپ کرده و به کاربر نمایش می‌دهیم:

<?php
function divide($x, $y){
    try{
        if ($y != 0)
	        echo $x / $y;
	    else
    	    throw new Exception("مقسوم علیه نمی‌تواند صفر باشد!");
	} catch ( Exception $e ){
	    echo $e->getMessage();
	}
}

حالا اگر این تابع را با مقسوم علیه صفر صدا بزنم، با نتیجه‌ای مشابه تصویر زیر مواجه خواهم شد:

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

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

مثال مدیریت خطای فایل PHP

برای اینکه کمی بیشتر با ساختار مدیریت استثنا کار کنیم، به این مثال توجه کنید.

فرض کنید مشابه آموزش کار با فایل در PHP می‌خواهیم یک فایل را باز کرده و محتوایی در آن قرار دهیم. قبل از اینکه برای باز شدن فایل تلاش کنیم، باید بررسی کنیم که فایل وجود دارد یا نه.

برای بررسی وجود داشتن فایل از تابع file_exists() استفاده می‌کنم. اگر فایل وجود نداشت، یک استثنای ساده ایجاد کرده و پیام متناسبی نمایش می‌دهم:

<?php
$path = "app/settings.conf";

try{
    if ( !file_exists($path) )
	    throw new Exception("فایل مورد نظر وجود ندارد.");
	$file = fopen( $path, "a+" );

	// do something

} catch (Exception $e){
    echo $e->getMessage();
}
?>

مدیریت خطای PHP

در این آموزش با بلوک try catch برای مدیریت خطا در PHP آشنا شدیم. فهمیدیم که استثنا یا Exception یک شئ کلاس در PHP است که در زمان وقوع حالت استثنایی ایجاد می‌شود.

به طور خلاصه، بلوک try وظیفه تشخیص و ایجاد استثنا (exception) در PHP را بر عهده دارد. دریافت و مدیریت این خطا در بلوک catch انجام می‌شود.

اگر در حال توسعه یک اسکریپت هستیم، باید وضعیت‌های غیرعادی و استثنایی را تشخیص داده و Exception صحیح پرتاب (throw) کنیم. همچنین اگر در حال برنامه نویسی و استفاده از توابع دیگر هستیم، باید در مواقع لزوم، عملیات مدیریت استثنا را انجام داده تا مشکلی در اجرای اسکریپت PHP به وجود نیاید.

امیدوارم پس از این آموزش بتوانید به راحتی با بلوک‌های مدیریت خطای try catch کار کنید. مستندات کامل مربوط به این بحث را می‌توانید در صفحه مستنداتش ببینید. اگر سؤال یا نکته آموزشی بیشتر دارید، از بخش دیدگاه‌ها مطرح کنید. 🙂

این آموزش بخشی از یک آموزش جامع و قدم به قدم در سبز دانش است: دوره رایگان آموزش PHP