با عرض سلام خدمت کاربران محترم وب سایت پی وی لرن. در این جلسه قصد داریم تا به مبحث مدیریت خطا (Error Handling) در php بپردازیم.
مدیریت خطا در php به طور پیش فرض بسیار ساده است.
یک پیغام خطا با نام فایل، شماره خط و توضیحات پیام خطا به مرورگر ارسال می شود.
مدیریت خطا در php یک بخش مهم در توسعه وب اپلیکیشن ها و اسکریپت ها می باشد.
اگر اسسکریپت شما فاقد کد بررسی خطا باشد، برنامه شما غیر حرفه ای به نظر می رسد علاوه بر اینکه خطرات امنیتی و ناشی از خطا ها را به جان می خرید.
این جلسه شامل برخی از متد های پرکاربرد رسیدگی به خطا می شود. مانند:
در اولین مثال کدی را نشان می دهیم که یک فایل متنی را باز می کند:
1 2 3 | <?php $file=fopen("welcome.txt","r"); ?> |
اگر فایل وجود نداشته باشد خطایی مانند خطا زیر دریافت می کنید:
1 2 | Warning: fopen(welcome.txt) [function.fopen]: failed to open stream: No such file or directory in C:\webfolder\test.php on line 2 |
برای جلوگیری از اینکه کاربر پیام خطا بالا را دریافت کند، موجودیت فایل را در ابتدا بررسی می کنیم:
1 2 3 4 5 6 7 | <?php if(!file_exists("welcome.txt")) { die("فایل پیدا نشد"); } else { $file=fopen("welcome.txt","r"); } ?> |
کد بالا به دلیل استفاده از مکانیسم ساده مدیریت خطا، نسبت به کد قبلی کارایی بیشتری دارد. زیرا از متوقف شدن اسکریپت بعد از خطا جلوگیری می کند.
به هر حال متوقف کردن اسکریپت به این سادگی همیشه راه مناسبی نیست.
در ادامه با توابع جایگزین php برای مدیریت خطا آشنا می شویم.
ایجاد یک مدیریت کننده خطا سفارشی بسیار ساده است. ما تابعی خاص ایجاد می کنیم تا بتواند هنگامی که خطایی رخ داد، فراخوانده شود.
این تابع حداقل باید دو پارامتر داشته باشد (سطح خطا و پیام خطا). اما تا پنج پارامتر هم میتواند داشه باشد (فایل، شماره خط و متن خطا)
ساختار تابع:
1 2 | error_function(error_level,error_message, 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 | ۸۱۹۱ |
حالا بیاید یک تابع برای مدیریت خطاها ایجاد کنیم:
1 2 3 4 5 | function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br>"; echo "Ending Script"; die(); } |
کد بالا یک تابع مدیریت خطا ساده است. وقتی فراخوانده شد، سطح خطا و پیغام خطا را دریافت می کند.
سپس دوباره سطح خطا و پیام خطا را چاپ کرده و اسکریپت را متوقف می کند.
حالا که تابع مدیریت خطا را ساختیم باید تصمیم بگیریم که چه موقع آن را به کار بگیریم.
ما قصد داریم تا تابع بالا را به مدیریت کننده خطا پیش فرض در زمان اجرای اسکریپت تبدیل کنیم.
این امکان وجود دارد تا مدیریت کننده خطا را فقط برای بعضی از خطاها به کار ببریم. در این صوذت اسکریپت می تواند خطاهای مختلفی را با روش های مختلف مدیریت کند. به هر حال ما قصد داریم تا مدیریت کننده خطا سفارشی مان را برای تمام خطا ها استفاده کنیم:
1 | set_error_handler("customError"); |
به دلیل اینکه ما می خواهیم تابع مان تمام خطا ها را مدیریت کند، تابع ()set_error_handler تنها به کی پارامتر نیاز دارد. پارامتر دوم می تواند برای یک سطح خطا استفاده شود.
می خواهیم تابع را نوسط چاپ متغیری که وجود ندارد امتحان کنیم:
1 2 3 4 5 6 7 8 9 10 11 12 | <?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); ?> |
خروجی به شکل زیر می باشد:
1 | Error: [8] Undefined variable: test |
وقتی کاربر میتواند داده هایی را وارد کند، بهتره که وقتی ورودی غیر مجاز وارد کرد یک خطا توسط تابع ()trigger_error به راه بیاندازیم.
1 2 3 4 5 6 | <?php $test=2; if ($test>=1) { trigger_error("مقدار باید یک یا کمتر از یک باشد"); } ?> |
خروجی به شکل زیر می باشد:
1 2 | Notice: مقدار باید یک یا کمتر از یک باشد in C:\webfolder\test.php on line 6 |
یک خطا در هر کجای اسکریپت که بخواهید می تواند راه اندازی شود. و با اضافه کردن پارامتر دوم می توانید سطح خطا را نیز مشخص کنید.
انواع خطا ممکن:
در مثال زیر اگر متغیر test$ بزرگتر از ۱ باشد یک E_USER_WARNING رخ می دهد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <?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); } ?> |
خروجی به شکل زیر است:
1 2 | Error: [512] مقدار باید یک یا کمتر از یک باشد Ending Script |
در مثال زیر ما یک ایمیل محتوی پیام خطا را ارسال می کنیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?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); } ?> |
خروجی کد بخ شکل زیر می باشد:
1 2 | Error: [512] مقدار باید یک یا کمتر از یک باشد Webmaster has been notified |
و ایمیل دریافتی باید حاوی پیام زیر باشد:
1 | Error: [512] مقدار باید یک یا کمتر از یک باشد |
خب جلسه مدیریت خطا در php نیر به پایان رسید.
در جلسه بعد به مبحث مدیریت استثنا در php خواهیم پرداخت.
محمد
سلام
من یک افزونه محاسبه کرایه حمل و نقل ووکامرس دارم.
زمانی که اتصال به اینترنت قطعه کل سایت به کما میبره.
میخوام با قطع اینترنت همچنان روش های دیگه حمل و نقل کار کنه.
من یه try نوشتم و سایت اجرا میشه بجز صفحه تسویه حساب که همچنان به حالت کما میره.
در تعریف catch(Exception $e) از
exit استفاده کردم نشد و کل سایت تعطیل میشه.
die هم همین طور.
return خوبه ولی صفحه تسویه حساب به کما میره.
لطفا راهنمایی کنید. متشکر.
پی وی لرن
با سلام
اگر افزونه را در لوکال استفاده می کنید از بابت اینترنت اگر به هاست اصلی انتقال دهید مشکلتان برطرف می شود ولی نه اگر می خواهید در حالت لوکال هم مشکلی نداشته باشد باید بررسی کنید احتمالا افزونه فایل هایی را از cdn می خواند مانند فایل های جی کوئری که اگر آنها را در لوکال انتقال دهید مشکل برطرف خواهد شد.