مدیریت خطا در زبان برنامه نویسی PHP

ترجمه و تالیف : پشتیبانی راکت
تاریخ انتشار : 13 خرداد 98
خواندن در 5 دقیقه
دسته بندی ها : پی اچ پی

در زمان نوشتن اسکریپت ها و برنامه های تحت وب ، مدیریت خطا یک بخش مهم به حساب می آید . اگر کد شما ، نقص مدیریت خطا داشته باشد ، برنامه طراحی شده بسیار مبتدی به نظر آمده و خطراتی ممکن است آن را تهدید نماید.

مدیریت خطا در زبان برنامه نویسی PHP 

در این بخش مهمترین و پرکاربردترین متدهای مدیریت خطادر PHP را بررسی می کنیم ، که عبارتند از :

  • تابع ساده ( ) die .
  • برخورد با خطاهای گوناگون و فعال کننده های خطا .
  • گزارش دهی خطا .

انواع خطا در زبان برنامه نویسی php

چهار نوع از رایج ترین خطاهای PHP آشنا شویم:

  • اولین نوع خطا Notice نام دارد. معنی واژه انگلیسی Notice در زبان فارسی "توجه" است. در حین کدنویسی زمانی با خطاهایی از این نوع مواجه می شویم که آن خطا لطمه ای به برنامه ما نمی زند. برای مثال، اگر در اسکریپت خود به متغیری اشاره کنیم که حاوی هیچ گونه Value یا "مقداری" نباشد، یک Notice در صفحه مروگر نمایش داده خواهد شد که برنامه نویس را از این موضوع مطلع سازد.
  • نوع دوم خطا Warning به معنی "هشدار" نام دارد. این نوع خطاها هم تا حدودی می توانند مشکل زا باشند که از آن جمله می توان به استفاده نابجا از یک متد اشاره کرد.
  • نوع سوم از خطاها، Parse Error نام دارند. کلمه Parse در لغت به معنی "تجزیه و تحلیل کردن" است و در زبان برنامه نویسی PHP منظور از error هایی از نوع Parse نگذاشتن علامت ; در پایان یک دستور، عدم قرار دادن یک علامت " در جایی که نیاز است، استفاده نابجا از علامت های { و [ و ... است.
  • نوع چهارم از خطا در زبان برنامه نویسی PHP چیزی است تحت عنوان Error و از جمله مثال هایی که می توان در ارتباط با Error ها مد نظر قرار داد، کمبود حافظه اختصاص داده شده به یک وب اپلیکیشن می باشد.

ساده ترین روش مدیریت خطا در PHP  تابع die

نحوه کار با تابع  die( ) را با یک مثال ساده نمایش می دهیم .

کد زیر یک مثال ساده را نشان می دهد که یک فایل متنی را باز می کند :

$file = fopen( "welcome.txt" , "r" ) ; 

حال اگر فایل به هر دلیلی وجود نداشته و یا از روی سرور پاک شده باشد ، برنامه پیام خطایی مشابه پیام زیر صادر می کند :

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

کد تابع die

if( !file_exists( "welcome.txt" ) )
{
   die("File not found");
}
else
{
   $file = fopen( "welcome.txt" , "r" ) ;
}

حال اگر در باز کردن فایل مورد نظر ، خطایی رخ دهد ، به جای پیام طولانی فوق ، پیام ملموس و کوتاه زیر نمایش داده می شود :

File not found

البته لازم به ذکر است که روش فوق برای خطاهای معمولی قابل استفاده بوده و در موارد مهمتر باید از مدیریت کننده های خطاهای پیشرفته تر استفاده نمود .
در بخش بعدی ، بخش طراحی مدیریت کننده خطا ها در PHP به تشریح روش های حرفه ای تر خواهیم پرداخت .

ایجاد یک مدیریت کننده خطا در PHP

ساخت یک مدیریت کننده خطا نسبتا ساده است . به طور معمول ، تابعی را طراحی می کنیم تا در هنگام بروز خطا در صفحه ، فراخوانی شود .

تابع طراحی شده بایستی حداقل دو پارامتر ورودی را دریافت و مدیریت کند :

  • شدت اهمیت خطا ( error level )
  • پیام خطا ( error message )

همچین چندین پارامتر اختیاری نیز می تواند داشته باشد :

  • نام فایل ( file name )
  • شماره خطی از برنامه که خطا در آن رخ داده است ( line number )
  • محتوای خطا ( error context )

شکل کلی یک تابع طراحی شده برای مدیریت خطا در PHP می تواند به صورت زیر باشد : 

error_function ( error_level , error_message , error_file , error_line , error_context ) ; 

پارامترهای کد فوق و استفاده آنها :

error_level : این پارامتر شدت اهمیت خطا را تعیین می کند . یک مقدار عددی است و شرح موارد آن در جدول راهنمای شماره ۱ آمده است. استفاده از این پارامتر اجباری است. این پارامتر پیام خطا را که حاوی اطلاعاتی راجع به آن است را تعیین می کند .

error_message : استفاده از این پارامتر اجباری است. این پارامتر نام فایلی که خطا در آن رخ داده است ، را مشخص می کند. استفاده از این پارامتر اختیاری است .

error_line : این پارامتر شماره خطی که خطا در آن رخ داده است را مشخص می کند. استفاده از این پارامتر اختیاری است. این پارامتر نیز تمامی متغیرها و مقدارهایشان که در کد برنامه ای که خطا در آن رخ داده است را شامل می شود .

error_context : استفاده از این پارامتر اختیاری است .

نحوه طراحی یک مدیریت کننده خطا

تابع زیر یک مدیریت کننده خطای معمولی را نشان می دهد که میزان شدت اهمیت خطا و پیام آن را در خروجی چاپ می کند : 

function customError( $errno , $errstr )
{

echo "Error : [$errno] $errstr ";

echo "Ending Script";

die( );

}

هنگامی که خطایی رخ می دهد ، تابع فوق شدت اهمیت خطا را توسط پارامتر errno$ و پیام خطا را توسط پارامتر errstr $دریافت کرده و در خروجی نشان می دهد .
اکنون که تابع مدیریت خطا را طراحی کردیم ، باید کد فراخوان آن را در جاهایی که می خواهیم ، قرار داده تا در صورت بروز خطا ، تابع فوق فراخوانی شود .

تنظیم فراخوان کننده تابع مدیریت خطا ( event handler )

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

لازم به ذکر است که این امکان وجود دارد تا شما برای هر بخش از کد یا دسته ای از توابع یک مدیریت کننده خطا پیش فرض تعیین کنید ، تا در مواقع مختلف بروز خطا ، به گونه های مختلف با آن برخورد نمایید .

اما در این مثال به وسیله تابع ( ) set_error_handler ، ما تابع ( ) customError را به عنوان مدیریت کننده خطای پیش فرض اسکریپت تعیین کرده ایم : 

set_error_handler( " customError " );

مثال : در مثال زیر ، پس از اینکه تابع مدیریت کننده خطا پیش فرض را برای برنامه تعیین کردیم ، در خط آخر مثال ، به برنامه دستور داده ایم تا مقدار متغیری که تعریف نشده است را چاپ کند !! این کار باعث بروز یک خطا شده و تابع مدیریت خطا را فراخوانی می کند :

// تابع مدیریت کننده خطا

function customError($errno, $errstr)

{

echo "<b>Error:</b> [$errno] $errstr";

}



// تعیین تابع پیض فرض برای مدیریت خطا

set_error_handler("customError");



// بروز و فراخوانی خطا

echo($test);

پس از اجرای کد فوق و بروز خطا ، پیام زیر به عنوان پیام خطا توسط تابع ( ) customError اعلام می شود :

 Error : [8] Undefined variable : test

تابع error_trigger

در این بخش کار با تابع ( ) error_trigger را فرا خواهید گرفت . از تابع ( ) error_trigger در زمانی استفاده می شود که بروز خطا را پیش بینی کرده و کد لازم را برای مدیریت آن تعیین می کنیم .

کار با این تابع را در قالب یک مثال آموزش می دهیم . معمولا خطا در جاهایی که از کاربر ورودی دریافت می کنید ، احتمال زیادی دارد ، که رخ دهد . مثلا کاربر مقادیر غیر مجاز وارد نماید .

در مثالی زیر کدی طراحی کرده ایم تا در صورتی که مقدار متغیر test$ از ۱۰ بیشتر بود ، یک پیام خطا توسط رویداد ( ) error_trigger صادر شود .

مثال

$test=20;

if ( $test > 10 )

{

trigger_error( "Value must be 10 or below" ) ;

}

خروجی این خطا ، به صورت زیر خواهد بود : 

Notice: Value must be 1 or below

in C:\webfolder\test.php on line 6

پیام خروجی مثال فوق را با تعیین یک تابع به عنوان تابع پیش فرض برای مدیریت خطا می توان اصلاح کرد .

در مثال زیر ، شکل کاملتری از مثال فوق را ارائه دادیم .

در کد زیر ، به علت اینکه تابع ( ) customError را به عنوان تابع مدیریت کننده پیش فرض کد تعریف کرده ایم ، در هنگام بروز خطا ، تابع ( ) error_trigger پارامترهای لازم را درباره خطا به تایع ( ) customError فرستاده و این بار این تابع خروجی خطا را اعلام کرده و آن را مدیریت می کند :

// تابع مدیریت کننده خطا

function customError( $errno , $errstr )

{

echo "Error: [$errno] $errstr<br>";

echo "Ending Script";

die( );

}



// تعیین تابع مدیریت کننده پیش فرض

set_error_handler( "customError",E_USER_WARNING ) ;



// بروز خطا و ارسال پارامترهای لازم 

$test = 20 ;

if ( $test > 10 )

{

trigger_error( "Value must be 10 or below",E_USER_WARNING ) ;

}

خروجی کد ، این بار به صورت زیر خواهد بود : 

Error: [512] Value must be 10 or below

Ending Script 

تابع error_log

به صورت پیش فرض ، PHP یک پیام حاوی اطلاعات خطا رخ داده را به سیستم logging سرور یا یک فایل خاص ، بسته به اینکه فایل php.ini ، بر روی سرور چگونه تنظیم شده باشد ، ارسال می کند .

به وسیله تابع ( ) error_log ، می توانید پیام های خطا رخ داده را به یک فایل خاص یا به ایمیل کاربر ارسال نمایید . ارسال یک ایمیل حاوی اطلاعات خطا می تواند یکی از کارآمدترین روش ها باشد . البته فقط این کار را برای خطاهای مهم و از کار اندازنده انجام دهید ، نه هر خطای معمولی ! .

در مثال زیر ، نحوه استفاده از تابع ( ) error_log را در عمل نمایش داده و در صورت بروز خطا ، ایمیلی حاوی اطلاعات آن به آدرس ایمیل کاربر ، ارسال می شود :

مثال

// تابع مدیریت کننده خطا و فرستنده ایمیل

function customError($errno, $errstr)

{

echo " Error: [$errno] $errstr<br>";

echo "Webmaster has been notified";

error_log("Error: [$errno] $errstr",1, " someone@example.com " , " From: webmaster@example.com " ) ;

}



// تعیین تابع پیش فرض خطا

set_error_handler("customError",E_USER_WARNING);



// مکان بروز خطا

$test=2;

if ($test>1)

{

trigger_error("Value must be 1 or below",E_USER_WARNING);

}

خروجی خطای رخ داده در سیستم به صورت زیر خواهدد بود :

Error: [512] Value must be 1 or below

Webmaster has been notified

همچین کاربر ایمیلی با محتویات زیر را دریافت خواهد کرد : 

Error: [512] Value must be 1 or below

مرجع توابع مدیریت خطا در PHP :

در این بخش مهمترین و پرکاربردترین توابع زبان PHP برای مدیریت خطاهای رخ داده در برنامه را معرفی کرده ایم . برای دریافت اطلاعات بیشتر بر روی نام هر تابع کلیک نمایید :
به وسیله این توابع می توانید خطاهای رخ داده در کدهای PHP را شناسایی و مدیریت کرده و اطلاعات مربوط به آنها را در log سرور ذخیره کرده و یا برای ایمیل کاربر ارسال نمایید 

نکته : تمامی توابع مدیریت خطای PHP ، به صورت پیش فرض بر روی سرورهای این زبان نصب شده و نیاز به هیچ نصب اضافه ای نیست .

( ) debug_backtrace  این تابع اطلاعات کاملی راجع به خطای رخ داده را ، به صورت یک آرایه نمایش می دهد .
( ) error_get_last این تابع اطلاعات آخرین خطای رخ داده در کد برنامه را بر می گرداند .
( ) error_log این تابع اطلاعات خطاهای رخ داده در صفحه را در یک فایل بر روی سرور ذخیره کرده و یا به ایمیل کاربر ارسال می کند .
( ) error_reporting این تابع مشخص می کند که چه خطاهایی به سیستم گزارش شوند .
( ) set_error_handler این تابع یک تابع را به عنوان تابع پیش فرض برای مدیریت خطاها در صفحه تعیین می کند .
( ) set_exception_handler این تابع ، یک تابع تعیین شده از سوی طراح را به عنوان تابع مدیریت کننده استثناها در صفحه تعیین می کند .
( ) trigger_error این تابع برای شناسایی یک خطا یا فراخوانی تابع مربوط به آن به کار می رود .
( ) user_error این تابع برای شناسایی یک خطا یا فراخوانی تابع مربوط به آن به کار می رود . عملکرد آن همانند تابع ( ) trigger_error است .

گردآوری و تالیف پشتیبانی راکت
آفلاین
user-avatar

باور ما اینست که کاربران ایرانی لایق بهترین‌ها هستند، از این رو ما تمام تلاش خود را می‌کنیم تا بتوانیم فیلم‌ها و مقالات آموزشی بروز و کاربردی را در اختیارتان قرار دهیم تا با استفاده از آنها بتوانید جزء بهترین‌ها در صنعت طراحی و برنامه‌نویسی وب شوید. ما ادعا نمی‌کنیم که بهترین هستیم ولی همیشه تمام تلاش خود را می‌کنیم بهترین عملکرد را به شما ارائه دهیم.

دیدگاه‌ها و پرسش‌ها

برای ارسال نظر لازم است ابتدا وارد سایت شوید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید