مدیریت خطا در php یک بخش مهم در توسعه وب اپلیکیشن ها و اسکریپت ها می باشد.
اگر ایسکریپت شما فاقد کد بررسی خطا باشد، برنامه شما غیر حرفه ای به نظر می رسد علاوه بر اینکه خطرات امنیتی و ناشی از خطا ها را به جان می خرید.
متد های پرکاربرد رسیدگی به خطا :
- تابع ساده ()die
- علت ایجاد خطا
- گزارش خطا
مدیریت خطا پایه: استفاده از تابع ()die
در اولین مثال کدی را نشان می دهیم که یک فایل متنی را باز می کند:
$file=fopen(“welcome.txt”,”r”);
?>
No such file or directory in C:\webfolder\test.php on line 2
برای جلوگیری از اینکه کاربر پیام خطا بالا را دریافت کند، موجودیت فایل را در ابتدا بررسی می کنیم:
if(!file_exists(“welcome.txt”)) {
die(“فایل پیدا نشد”);
} else {
$file=fopen(“welcome.txt”,”r”);
}
?>
کد بالا به دلیل استفاده از مکانیسم ساده مدیریت خطا، نسبت به کد قبلی کارایی بیشتری دارد. زیرا از متوقف شدن اسکریپت بعد از خطا جلوگیری می کند.
به هر حال متوقف کردن اسکریپت به این سادگی همیشه راه مناسبی نیست.
ایجاد یک مدیریت کننده خطا سفارشی
ایجاد یک مدیریت کننده خطا سفارشی بسیار ساده است. ما تابعی خاص ایجاد می کنیم تا بتواند هنگامی که خطایی رخ داد، فراخوانده شود.
این تابع حداقل باید دو پارامتر داشته باشد (سطح خطا و پیام خطا). اما تا پنج پارامتر هم می تواند داشته باشد (فایل، شماره خط و متن خطا)
ساختار تابع:
error_file,error_line,error_context)
پارامتر | توضیحات |
error_level | سطح گزارش خطا برای خطایی که کاربر تعریف کرده را مشخص می کند.باید مقداری عددی باشد.در جدول زیر سطوح گزارش خطا احتمالی آمده است |
error_message | پیام خطا را مشخص می کند |
error_file | نام فایلی را که خطا در آن اتفاق افتاده است را مشخص می کند |
error_line | شماره خطی را که خطا در آن اتفاق افتاده است را مشخص می کند. |
error_context | یک آرایه از متغیر ها و مقادیرشان که در هنگام رخ دادن خطا استفاده می شدند را مشخص می کند. |
سطوح گزارش خطا
توضیحات | ثابت | مقدار |
خطاهای کم اهمیت زمان اجرا. اجرای اسکریپت متوقف نمی شود | E_WARNING | ۲ |
اطلاعیه های زمان اجرا. اسکریپت در زمان اجرا چیزی را پیدا می کند که می تواند خطا باشد. معمولا در هنگام اجرای اسکریپت اتفاق می افتد | E_NOTICE | ۸ |
خطای خطرناک تولید شده توسط کاربر. مانند یک نوع E_ERROR می باشد که توسط برنامه نویس با تابع ()trigger_error به وجود آمده است | E_USER_ERROR | ۲۵۶ |
هشدار کم اهمیت تولید شده توسط کاربر. مانند یک نوع E_WARNING می باشد که توسط برنامه نویس با تابع ()trigger_error به وجود آمده است | E_USER_WARNING | ۵۱۲ |
اطلاعیه تولید شده توسط کاربر. مانند یک نوع E_NOTICE می باشد که توسط برنامه نویس با تابع ()trigger_error به وجود آمده است | E_USER_NOTICE | ۱۰۲۴ |
خطای خطرناک قابل گرفتن. مانند یک E_ERROR است اما می تواند توسط مدیریت کاربر تعریف شده گرفتار شوذ. | E_RECOVERABLE_ERROR | ۴۰۹۶ |
تمامی خطا ها و هشدار ها | E_ALL | ۸۱۹۱ |
حالا بیاید یک تابع برای مدیریت خطاها ایجاد کنیم:
echo “<b>Error:</b> [$errno] $errstr<br>”;
echo “Ending Script”;
die();
}
کد بالا یک تابع مدیریت خطا ساده است. وقتی فراخوانده شد، سطح خطا و پیغام خطا را دریافت می کند.
سپس دوباره سطح خطا و پیام خطا را چاپ کرده و اسکریپت را متوقف می کند.
حالا که تابع مدیریت خطا را ساختیم باید تصمیم بگیریم که چه موقع آن را به کار بگیریم.
تنظیم مدیریت کننده خطا
ما قصد داریم تا تابع بالا را به مدیریت کننده خطا پیش فرض در زمان اجرای اسکریپت تبدیل کنیم.
این امکان وجود دارد تا مدیریت کننده خطا را فقط برای بعضی از خطاها به کار ببریم. در این صوذت اسکریپت می تواند خطاهای مختلفی را با روش های مختلف مدیریت کند. به هر حال ما قصد داریم تا مدیریت کننده خطا سفارشی مان را برای تمام خطا ها استفاده کنیم:
به دلیل اینکه ما می خواهیم تابع مان تمام خطا ها را مدیریت کند، تابع ()set_error_handler تنها به یک پارامتر نیاز دارد. پارامتر دوم می تواند برای یک سطح خطا استفاده شود.
مثال
می خواهیم تابع را نوسط چاپ متغیری که وجود ندارد امتحان کنیم:
<?php
//error handler function
function customError($errno, $errstr) {
echo “<b>Error:</b> [$errno] $errstr”;
}
//set error handler
set_error_handler(“customError”);
//trigger error
echo($test);
?>
خروجی به شکل زیر می باشد:
راه اندازی یک خطا
وقتی کاربر می تواند داده هایی را وارد کند، بهتره که وقتی ورودی غیر مجاز وارد کرد یک خطا توسط تابع ()trigger_error به راه بیاندازیم.
مثال
$test=2;
if ($test>=1) {
trigger_error(“مقدار باید یک یا کمتر از یک باشد”);
}
?>
خروجی به شکل زیر می باشد:
in C:\webfolder\test.php on line 6
انواع خطا ممکن:
- E_USER_ERROR
- E_USER_WARNING
- E_USER_NOTICE
مثال
در مثال زیر اگر متغیر test$ بزرگتر از ۱ باشد یک E_USER_WARNING رخ می دهد:
<?php
//error handler function
function customError($errno, $errstr) {
echo “<b>Error:</b> [$errno] $errstr<br>”;
echo “Ending Script”;
die();
}
//set error handler
set_error_handler(“customError”,E_USER_WARNING);
//trigger error
$test=2;
if ($test>=1) {
trigger_error(“مقدار باید یک یا کمتر از یک باشد”,E_USER_WARNING);
}
?>
خروجی به شکل زیر است:
Ending Script
ارسال یک پیام خطا با ایمیل
در مثال زیر ما یک ایمیل محتوی پیام خطا را ارسال می کنیم:
<?php
//error handler function
function customError($errno, $errstr) {
echo “<b>Error:</b> [$errno] $errstr<br>”;
echo “Webmaster has been notified”;
error_log(“Error: [$errno] $errstr”,1,
“someone@example.com”,”From: webmaster@example.com”);
}
//set error handler
set_error_handler(“customError”,E_USER_WARNING);
//trigger error
$test=2;
if ($test>=1) {
trigger_error(“مقدار باید یک یا کمتر از یک باشد”,E_USER_WARNING);
}
?>
خروجی کد بخ شکل زیر می باشد:
Webmaster has been notified
و ایمیل دریافتی باید حاوی پیام زیر باشد:
Error: [512] مقدار باید یک یا کمتر از یک باشد
نظراتتون رو زیر همین پست با ما به اشتراک بگذارید.