خطاها در PHP چگونه رخ می دهد؟

زمانیکه کدهای نوشته شده شما به هر دلیلی دارای ایراد باشه (سینتکس یا منطق) اسکریپت شما دچار خطا خواهد شد و نوع خطا به همراه توضیحات مربوط به خطا ، برای مرورگر کاربر ارسال خواهد شد.

این مکانیزم بصورت پیشفرض در PHP   وجود داره و توسط یک تابع Built In پیاده سازی شده است.

راهکارهای مدیریت شخصی خطاها در PHP  :

می توان از بروز خیلی از خطاها در php   جلوگیری کرد و بخشی از خطاهای قابل پیش بینی را تحت کنترل خود در آورد . به مثال زیر توجه کنید :

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

fopen("test.txt","r");

در صورت موجود نبودن فایل مشخص شده ("test.txt") ، اجرای کد بالا منجر به بروز خطا خواهد شد لذا می توان با یک مکانیزمی ساده از بروز چنین خطایی جلوگیری کرد:

<?php

if(!file_exists("test.txt"))

 {

  die("File not found");

 }

 Else

 {

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

 }

?>

 


در کدهای بالا ما ابتدا با تابع file_exists از موجود بود فایل مورد نظر مطمئن شدیم سپس اقدام به باز کردن اون کردیم . همینطور از تابع دیگری بنام die  نیز استفاده کردیم که از اجرا شدن ادامه اسکریپت جلوگیری کنیم. حالا بر اساس کدهای نوشته شده در بالا در صورت نبودن فایل در مسیر مشخص شده پیغام " File not found" به کاربر نمایش داده می شود و هندلر خطای php  وارد عمل نخواهد شد . شما در این آموزش یاد میگیرید که بایستی حدالامکان کنترل برنامه رو خودمون بدست بگیریم و اجازه ندهیم که توابع مدیریت کننده خطای توکار خود php   وارد عمل بشه که دلایلش رو در ادامه بهتر متوجه خواهید شد.

پس تا اینجای کار متوجه شدید که بایستی با تسلط نسبی به توابع و  شناخت امکانات موجود php   می توانیم تا حد امکان ، خطاهارو کنترل و مدیریت کنیم .

در ادامه با مکانیزم های دیگر php برای مدیریت شخصی خطاها بیشتر آشنا می شوید.

 

 

انواع خطاها :

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

 

 

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

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

آیا نیازی به تغییر تابع پیشفرض مدیریت کننده خطا هست یا نه ؟

در پاسخ باید گفت که اگر شما در حال یاد گرفتن php  هستید نیازی به تغییر این تابع درون اسکریپتتون نیست ولی اگر شما در حال نوشتن یک برنامه تجاری هستید توصیه میشه که حتما این کار رو انجام بدید و نگذارید تا php  همه خطاهارو با تمام جزئیات برای کاربر نشون بده (نوع خطا ، نام فایل ، شماره خط خطا ، توضیحات خطا و ...) چرا که ممکنه افراد سودجو از این اطلاعات به عنوان یک حفره امنیتی استفاده کرده و سعی در نفوذ به اسکریپت شما کنن ، بنابراین بهتر است در پروژه های تجاری بجای استفاده از تابع Errorhandler  خود php  که کل توضیحات خطا رو برای مرورگر کاربر ارسال میکنه ، از یک تابع جایگزینی که خودمون تعریف میکنیم استفاده کنیم و بجای ارسال جزئیات فنی خطا به کاربران سایت ، این اطلاعات رو برای برنامه نویس یا مدیر فنی سایت ایمیل کنیم و برای کاربر هم فقط یک پیغام مناسب رو ارسال کنیم.

 

 

چطور میتونم تابع پیشفرض مدیریت کننده خطا در php  را تغییر بدم ؟

خیلی ساده است ، شما برای تغییر تابع Errorhandler  پیشفرض php  کافیه یک تابع جایگزین بنویسید که دارای یکسری پارامترها هست ولی توجه داشته باشید که ترتیب پارامترهای این تابع طبق اعلان توسعه دهندگان php  به قرار زیر هست :

  error_level   

  error_message

  error_file

  error_line

  error_context  

 

همانطور که در بالا میبینید شما می تونید 5 پارامتر به ترتیب با عملکردهای مشخص شده در بالا به این تابع بدید.

 

این متغیرها (پارامترها) در زمان بروز خطا توسط تریگرهای خود php  پر میشن و شما میتونید با دریافت مقادیر داخلشون ، از مشخصات خطا آگاه بشید. در ضمن نیازی نیست که حتما نام های مشخص شده در بالا رو به عنوان نام پارامتر مشخص کنید بلکه می تونید هر اسمی رو تعیین کنید ولی چیزی که مهم هست ترتیب این پارامتر ها هست که اولی نوع خطا رو مشخص می کنه و در اصل بیانگر سطح خطایی هست که رخ داده که باید به این نکته دقت کنید که تابع جایگزینی که ما میخواهیم برای مدیریت خطاهامون بجای تابع داخلی خود php  تنظیم کنیم تنها قادر به مدیریت خطاهای زیر هست که در زمان بروز هر یک از سطوح زیر ، کد مربوط به اون سطح از خطا رو درون پارامتر اول تابع سفارشی ما قرار میده :

errorhandling

 

پس حالا که فهمیدیم برای بدست گرفتن مدیریت خطاهای قابل کنترل که لیست آن در بالا ذکر شد بایستی یک تابع جدید ایجاد کنیم و 5 تا پارامتر گفته شده رو بهش بدیم ، بریم سراغ اینکه چطور باید این تابع رو بنویسیم :

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

function customError($errno, $errstr)

{
  echo "<b>Error:</b> [$errno] $errstr<br>";
  echo "Ending Script";
  die();
}

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

تا اینجای کار شما فقط یک تابع جدید نوشتید تا در زمان بروز هر گونه خطایی در اجرای اسکریپت شما فراخوانی شود ولی اگر الان خودتون یک خطای عمدی در اسکریت خودتون بوجود بیارید خواهید دید که بازهم پیغام های خطای تابع مدیریت کننده خطای خود php  نشون داده میشه ، پس راه چاره چیست ؟ مشخصه که باید شما به php  بگید که این تابعی که نوشتیم رو به عنوان تابع مدیریت کننده خطا استفاده کنه ، نه اون تابعی که خودش بصورت built in داره

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

 set_error_handler("customError") ;

این تابع میاد نام فانکشنی که به عنوان یک پارامتر رشته ای براش مشخص می کنیم رو به عنوان تابع پیشفرض مدیریت کننده خطاهای قابل کنترل در نظر میگیره 

 

دریافت پی دی اف مقاله
عنوان: مدیریت خطا در php
حجم: 538 کیلوبایت