مدیریت خطاها در هر زبان برنامهنویسی اهمیت بسیار زیادی دارد و PHP نیز از این قضیه مستثنی نیست؛ خوشبختانه تنظیمات مدیریت خطا در PHP بسیار راحت است که در ادامه یک راهنمای خلاصه و کاربردی برای دولوپرهای تازهکار این زبان جمعآوری کردهایم تا بهراحتی بتوانند خطاها در این زبان برنامهنویسی محبوب را مدیریت کنند.
سطح خطاها
Constant (مقدار ثابت) و مقادیر عددی که در ادامه معرفی میشوند را میتوانید بهعنوان آرگومان در تابع ()error_reporting استفاده کرده و خطاهای اسکریپت خود را بهراحتی مدیریت کنید:
مقدار کانستنت توضیحات
1 E_ERROR این مقدار ارورهای بهاصطلاح Fatal که اجرای ادامهٔ اسکریپت را متوقف میکنند نمایش میدهد.
2 E_WARNING این مقدار Warningها (هشدارهای) بهوجود آمده درحین اجرای اسکریپت (Run-time) را نمایش میدهد (لازم بهذکر است که این هشدارها باعث متوقف شدن ادامهٔ اجرای اسکریپت نخواهند شد).
4 E_PARSE این مقدار ارورهایی که توسط Parser زبان 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 را نمایش میدهد. بهعبارت دیگر، نمایش میدهد که احتمالاً یک ارور خطرناک ایجاد شده است اما موتور Zend را در شرایطی بیثبات ترک نمیکند و اگر ارورهایی از این دست توسط دولوپر هندل نشوند، اپلیکیشن همانگونه که در شرایط E_ERROR متوقف میشود، از ادامه باز میایستد.
8192 E_DEPRECATED این مقدار Noticeهای ایجاد شده درحین Run-time را نمایش میدهد. با فعال کردن این دسته از ارورها، هشدارهایی در مورد کد نمایش داده خواهند شد که در نسخههای بعدی PHP کار نخواهند کرد.
16384 E_USER_DEPRECATED این مقدار پیامهای هشدارآمیز ایجاد شده توسط کاربر را نمایش میدهد. لازم بهذکر است که این مقدار شبیه به E_DEPRECATED است با این تفاوت که توسط تابع ()trigger_error زبان PHP ایجاد میگردد.
32767 E_ALL این مقدار تمامی ارورها و هشدارهایی که نسخهٔ PHP سیستم ساپورت میشوند را نمایش میدهد (لازم بهذکر است که از مقدار ۱- نیز بهجای 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);
همانطور که میتوان حدس زد، مقدار ورودی ۰ برای این تابع که در خط ۳ درنظر گرفته شده منجر به این خواهد گشت تا هیچ اروری نمایش داده نشود. در خطوط ۶ و ۷ هم میبینیم که مقادیر E_ALL و ۱- درنظر گرفته شدهاند که باعث میگردند تمامی ارورهای پیاچپی نمایش داده شوند (البته لازم بهذکر است که یکی از این خطوط برای نمایش خطاها کافی است و صرفاً از این جهت هر ۲ مورد را آوردهایم که با آنها آشنا شوید). در خط ۱۰ هم دستور دادهایم که تمامی ارورها (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 برابر با ۱ یا On قرار داده شده باشد:
<?php
ini_set("display_errors", 1);
// Or
ini_set("display_errors", "On");
سطح خطاها
Constant (مقدار ثابت) و مقادیر عددی که در ادامه معرفی میشوند را میتوانید بهعنوان آرگومان در تابع ()error_reporting استفاده کرده و خطاهای اسکریپت خود را بهراحتی مدیریت کنید:
مقدار کانستنت توضیحات
1 E_ERROR این مقدار ارورهای بهاصطلاح Fatal که اجرای ادامهٔ اسکریپت را متوقف میکنند نمایش میدهد.
2 E_WARNING این مقدار Warningها (هشدارهای) بهوجود آمده درحین اجرای اسکریپت (Run-time) را نمایش میدهد (لازم بهذکر است که این هشدارها باعث متوقف شدن ادامهٔ اجرای اسکریپت نخواهند شد).
4 E_PARSE این مقدار ارورهایی که توسط Parser زبان 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 را نمایش میدهد. بهعبارت دیگر، نمایش میدهد که احتمالاً یک ارور خطرناک ایجاد شده است اما موتور Zend را در شرایطی بیثبات ترک نمیکند و اگر ارورهایی از این دست توسط دولوپر هندل نشوند، اپلیکیشن همانگونه که در شرایط E_ERROR متوقف میشود، از ادامه باز میایستد.
8192 E_DEPRECATED این مقدار Noticeهای ایجاد شده درحین Run-time را نمایش میدهد. با فعال کردن این دسته از ارورها، هشدارهایی در مورد کد نمایش داده خواهند شد که در نسخههای بعدی PHP کار نخواهند کرد.
16384 E_USER_DEPRECATED این مقدار پیامهای هشدارآمیز ایجاد شده توسط کاربر را نمایش میدهد. لازم بهذکر است که این مقدار شبیه به E_DEPRECATED است با این تفاوت که توسط تابع ()trigger_error زبان PHP ایجاد میگردد.
32767 E_ALL این مقدار تمامی ارورها و هشدارهایی که نسخهٔ PHP سیستم ساپورت میشوند را نمایش میدهد (لازم بهذکر است که از مقدار ۱- نیز بهجای 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);
همانطور که میتوان حدس زد، مقدار ورودی ۰ برای این تابع که در خط ۳ درنظر گرفته شده منجر به این خواهد گشت تا هیچ اروری نمایش داده نشود. در خطوط ۶ و ۷ هم میبینیم که مقادیر E_ALL و ۱- درنظر گرفته شدهاند که باعث میگردند تمامی ارورهای پیاچپی نمایش داده شوند (البته لازم بهذکر است که یکی از این خطوط برای نمایش خطاها کافی است و صرفاً از این جهت هر ۲ مورد را آوردهایم که با آنها آشنا شوید). در خط ۱۰ هم دستور دادهایم که تمامی ارورها (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 برابر با ۱ یا On قرار داده شده باشد:
<?php
ini_set("display_errors", 1);
// Or
ini_set("display_errors", "On");