مدیریت خطاها در هر زبان برنامهنویسی اهمیت بسیار زیادی دارد و PHP نیز از این قضیه مستثنی نیست که خوشبختانه تنظیمات مدیریت خطا در PHP بسیار راحت است که در ادامه یک راهنمای خلاصه و کاربردی برای دولوپرهای تازهکار این زبان جمعآوری کردهایم تا به راحتی بتوانند خطاها و اِکسپشنها را در این زبان برنامهنویسی محبوب مدیریت کنند.
سطح خطاها در زبان PHP
Constant (مقدار ثابت) و مقادیر عددی که در ادامه معرفی میشوند را میتوانید به عنوان آرگومان در تابع ()error_reporting استفاده کرده و خطاهای اسکریپت خود را به راحتی مدیریت کنید:
مقدار | کانستنت | توضیحات |
1 | E_ERROR | این کانستنت ارورهای به اصطلاح Fatal که اجرای ادامهٔ اسکریپت را متوقف میکنند، نمایش میدهد. |
2 | E_WARNING | این کانستنت Warning به وجود آمده در حین اجرای اسکریپت (Run-time) را نمایش میدهد (لازم به ذکر است که این هشدارها باعث متوقف شدن ادامهٔ اجرای اسکریپت نخواهند شد.) |
4 | E_PARSE | این کانستنت ارورهایی که توسط مُفسر زبان PHP در حین کامپایل وب اپلیکیشن به وجود میآیند را نمایش میدهد. |
8 | E_NOTICE | این کانستنت Notice به وجود آمده در حین اجرای اسکریپت را نمایش میدهد. به عبارت دیگر، چیزی که به نظر میرسد یک ارور باشد! |
16 | E_CORE_ERROR | این کانستنت ارورهای به اصطلاح Fatal در فرایند استارت شدن PHP را نمایش میدهد (لازم به ذکر است که این کانستنت شبیه به E_ERROR است با این تفاوت که توسط هستهٔ PHP ایجاد میگردد.) |
32 | E_CORE_WARNING | این کانستنت ارورهای به اصطلاح Non-fatal در فرایند استارت شدن PHP را نمایش میدهد (لازم به ذکر است که این کانستنت شبیه به E_WARNING است با این تفاوت که توسط هستهٔ PHP ایجاد میگردد.) |
64 | E_COMPILE_ERROR | این کانستنت ارورهایی از نوع Fatal که در زمان کامپایل به وجود میآیند را نمایش میدهد (لازم به ذکر است که این کانستنت شبیه به E_ERROR است با این تفاوت که توسط موتور Zend ایجاد میگردد.) |
128 | E_COMPILE_WARNING | این کانستنت ارورهای به اصطلاح Non-fatal که در زمان کامپایل به وجود میآیند را نمایش میدهد (لازم به ذکر است که این کانستنت شبیه به E_WARNING است با این تفاوت که توسط موتور Zend ایجاد میگردد.) |
256 | E_USER_ERROR | این کانستنت ارورهای به اصطلاح Fatal که توسط کاربر ایجاد میشوند را نمایش میدهد (لازم به ذکر است که این کانستنت شبیه به E_ERROR است با این تفاوت که توسط تابع ()trigger_error زبان PHP ایجاد میگردد.) |
512 | E_USER_WARNING | این کانستنت هشدارهای به اصطلاح Non-fatal که توسط کاربر ایجاد میشوند را نمایش میدهد (لازم به ذکر است که این کانستنت شبیه به E_WARNING است با این تفاوت که توسط تابع ()trigger_error زبان PHP ایجاد میگردد.) |
1024 | E_USER_NOTICE | این کانستنت Notice ایجاد شده توسط کاربر را نمایش میدهد (لازم به ذکر است که این کانستنت شبیه به E_NOTICE است با این تفاوت که توسط تابع ()trigger_error زبان PHP ایجاد میگردد.) |
2048 | E_STRICT | این کانستنت امکانی را فراهم میسازد تا PHP پیشنهاداتی به منظور اِعمال در سورسکد ارائه دهد تا از سازگاری کد در آینده اطمینان حاصل شود. |
4096 | E_RECOVERABLE_ERROR | این کانستنت ارورهای به اصطلاح Catchable Fatal را نمایش میدهد. به عبارت دیگر، نمایش میدهد که احتمالاً یک ارور خطرناک ایجاد شده است اما موتور زِند را در شرایطی بیثبات ترک نمیکند و اگر ارورهایی از این دست توسط دولوپر هندل نشوند، اپلیکیشن همانگونه که در شرایط E_ERROR متوقف میشود، از ادامه باز میایستد. |
8192 | E_DEPRECATED | این کانستنت Notice ایجاد شده در حین Run-time را نمایش میدهد که با فعال کردن این دسته از ارورها، هشدارهایی در مورد کد نمایش داده خواهند شد که در نسخههای بعدی PHP کار نخواهند کرد. |
16384 | E_USER_DEPRECATED | این کانستنت پیامهای هشدارآمیز ایجاد شده توسط کاربر را نمایش میدهد (لازم به ذکر است که این مقدار شبیه به E_DEPRECATED است با این تفاوت که توسط تابع ()trigger_error زبان PHP ایجاد میگردد.) |
32767 | E_ALL | این کانستنت تمامی ارورها و هشدارهایی که در نسخهٔ PHP نصب شده روی سرور ساپورت میشوند را نمایش میدهد (لازم به ذکر است که از مقدار 1- نیز به جای E_ALL میتوان استفاده کرد.) |
راهنمای استفاده از تابع ()error_reporting
به طور کلی، تابع ()error_reporting مشخص میکند که کدام دسته از ارورهای اسکریپت ما در معرض دید کاربر قرار بگیرند و لازم به ذکر است که پارامتر ورودی این تابع (Level) اختیاری است و مشخص میسازد که چه سطحی از نمایش ارورها در نظر گرفته شود که هم از اعداد از پیش تعریف شده و هم از کانستنتهایی که در بالا بدانها اشاره شد میتوان به عنوان پارامتر ورودی استفاده کرد (توصیه میشود که تا حد امکان به جای اعداد از کانستنتها استفاده شود تا در ورژنهای آتی این زبان با هیچگونه کانفلیکتی برخورد نکنید.)
برای روشنتر شدن نحوهٔ هندل کردن ارورها در زبان PHP، در ادامه چند مثال از نحوهٔ استفاده از این تابع برای مدیریت خطاها در این زبان آورده شده است:
<?php
// Turn off all error reporting
error_reporting(0);
// Report all PHP errors
error_reporting(E_ALL);
error_reporting(-1);
// Report all errors except E_NOTICE
error_reporting(E_ALL ^ E_NOTICE);
//Report errors and warnings
error_reporting(E_ERROR | ERROR_WARNING);
همانطور که میتوان حدس زد، مقدار ورودی 0 برای این تابع که در خط سوم در نظر گرفته شده منجر بدین خواهد گشت تا هیچ اروری نمایش داده نشود. در خطوط ششم و هفتم هم میبینیم که مقادیر E_ALL و 1- در نظر گرفته شدهاند که باعث میگردند تمامی ارورهای پیاچپی نمایش داده شوند (البته لازم به ذکر است که یکی از این خطوط برای نمایش خطاها کافی است و صرفاً از این جهت هر دو مورد را آوردهایم که با هر دو روش آشنا شوید.) در خط دهم نیز دستور دادهایم که تمامی ارورها (E_ALL) نمایش داده شوند به جزء E_NOTICE و در نهایت در خط سیزدهم هم گفتهایم هم ارورها (E_ERROR) و هم هشدارها (ERROR_WARNING) نمایش داده شوند.
تفاوت توابع ()error_reporting و ()ini_set
همانطور که در کد زیر ملاحظه میشود، هر دو تابع کار یکسانی انجام میدهند:
<?php
// The same as error_reporting(E_ALL);
ini_set("error_reporting", E_ALL);
در واقع، کاری که تابع ()ini_set انجام میدهد این است که تنظیمات فایل php.ini را به اصطلاح Override (رونویسی) میکند. در پایان هم بایستی یادآور شویم برای آنکه ارورها نمایش داده شوند، حتماً بایستی مقدار display_errors در فایل php.ini و یا تابع ()ini_set برابر با 1 یا On قرار داده شده باشد:
<?php
ini_set("display_errors", 1); // Or ini_set("display_errors", "On");
در پایان چنانچه علاقمند به فراگیری گام به گام زبان برنامهنویسی PHP هستید، میتوانید به دورهٔ آموزش PHP در سکان آکادمی مراجعه نمایید.