⚠️ درس چهارم: مدیریت خطاها (Error Handling)؛ جلوگیری از کرش کردن سایت
🎯 هدف این درس: یادگیری نحوه مدیریت خطاهای احتمالی در کد با استفاده از بلوکهای Try/Catch، جلوگیری از نمایش پیامهای خطرناک به کاربر و لاگگیری حرفهای برای عیبیابی سریعتر.
مهمان عزیز! 👋
تا اینجا کدهایی نوشتیم که در شرایط ایدهآل کار میکنند. اما در دنیای واقعی همیشه همه چیز طبق برنامه پیش نمیرود. ممکن است دیتابیس قطع شود، فایلی پیدا نشود یا کاربر دادهای نامعتبر وارد کند.
اگر این خطاها مدیریت نشوند، سایت شما با یک صفحه سفید (White Screen of Death) یا پیامهای ترسناک PHP مواجه میشود که هم تجربه کاربری را خراب میکند و هم اطلاعات امنیتی سرور را لو میدهد.
در این درس یاد میگیریم چگونه مثل یک برنامهنویس حرفهای، خطاها را «پیشبینی» و «مدیریت» کنیم تا سایت حتی در صورت بروز مشکل، پایدار بماند.
💡 چرا مدیریت خطا مهم است؟
۱. حفظ امنیت (عدم نمایش مسیر فایلها).
۲. تجربه کاربری بهتر (نمایش پیام مناسب به جای کد خطا).
۳. عیبیابی آسانتر (ذخیره جزئیات خطا در فایل Log).
🛑 مرحله ۱: درک انواع خطا در PHP
قبل از مدیریت، باید بدانیم چه نوع خطاهایی داریم:
- Syntax Error: اشتباه تایپی در کد (مثل فراموش کردن سمیکالن). این خطا باعث توقف کامل اسکریپت میشود.
- Fatal Error: خطای جدی مثل فراخوانی تابعی که وجود ندارد.
- Warning: هشدارهایی که اجرای کد را متوقف نمیکنند اما نشاندهنده مشکل هستند (مثل تقسیم بر صفر).
- Exception: خطاهایی که در زمان اجرا رخ میدهند و ما میتوانیم آنها را با Try/Catch مدیریت کنیم (مثل خطای اتصال به دیتابیس).
🛡️ مرحله ۲: استفاده از Try / Catch / Finally
ساختار اصلی مدیریت استثنا (Exception Handling) در PHP شامل سه بخش است:
- Try: کدی که احتمال خطا دارد در این بلوک قرار میگیرد.
- Catch: اگر خطایی رخ دهد، این بلوک اجرا میشود و میتوانیم پیام مناسبی نمایش دهیم.
- Finally: (اختیاری) کدی که در هر صورت (با خطا یا بدون خطا) اجرا میشود. معمولاً برای بستن اتصالات استفاده میشود.
error_handling.php
PHP
8.x
<?php
$number = 10;
$divider = 0;
try {
// بررسی شرط دستی برای ایجاد استثنا
if ($divider == 0) {
throw new Exception("تقسیم بر صفر مجاز نیست!");
}
$result = $number / $divider;
echo "نتیجه: " . $result;
} catch (Exception $e) {
// دریافت پیام خطا از شیء Exception
echo "❌ خطایی رخ داد: " . $e->getMessage();
// اینجا میتوانیم خطا را در فایل Log ذخیره کنیم
error_log($e->getMessage());
} finally {
echo "<br>✅ عملیات بررسی خطا به پایان رسید.";
}
📝 مرحله ۳: لاگگیری خطاها (Error Logging)
نمایش خطا به کاربر خوب است، اما برای توسعهدهنده کافی نیست. ما نیاز داریم جزئیات فنی خطا را در یک فایل مخفی ذخیره کنیم تا بعداً بررسی کنیم.
custom_logger.php
PHP
8.x
<?php
function log_error($message, $file = 'errors.log') {
$timestamp = date('Y-m-d H:i:s');
$logMessage = "[$timestamp] ERROR: $message" . PHP_EOL;
// اضافه کردن خطا به انتهای فایل لاگ
file_put_contents($file, $logMessage, FILE_APPEND);
}
// تست تابع
try {
throw new Exception("اتصال به دیتابیس برقرار نشد.");
} catch (Exception $e) {
log_error($e->getMessage());
echo "متأسفانه مشکلی پیش آمده است. لطفاً بعداً تلاش کنید.";
}
❌ خطاهای رایج در مدیریت خطا
🚫 اشتباه مرگبار:
استفاده از die($e->getMessage()) در محیط Production. این کار مسیر فایلها و ساختار دیتابیس را به هکر نشان میدهد! همیشه پیام عمومی نمایش دهید و جزئیات را Log کنید.
- بلوک Catch خالی: اگر Catch را خالی بگذارید، خطا نادیده گرفته میشود و دیباگ کردن غیرممکن میشود.
- مدیریت تمام خطاها با یک Catch: بهتر است برای خطاهای مختلف (مثلاً دیتابیس و فایل) Catchهای جداگانه داشته باشید.
🏁 جمعبندی درس چهارم
مهمان عزیز، در این درس یاد گرفتی:
- ✅ تفاوت بین Warning، Fatal Error و Exception.
- ✅ نحوه استفاده از ساختار Try/Catch/Finally.
- ✅ چگونه با throw خطاهای دستی ایجاد کنیم.
- ✅ اهمیت لاگگیری خطاها به جای نمایش آنها به کاربر.
🎓 تمرین عملی درس چهارم
کدی بنویس که سعی کند یک فایل متنی غیرموجود را باز کند. اگر فایل وجود نداشت، یک Exception پرتاب کن و پیام “فایل یافت نشد” را در یک فایل log.txt ذخیره کن.
🗺️ نقشه راه دوره: شما اینجا هستید!
برای اینکه بدانی دقیقاً کجای مسیر هستی و چه درسهایی در انتظار توست، به جدول زیر نگاه کن. درس فعلی با رنگ متفاوت مشخص شده است.
| درس | عنوان درس | آنچه یاد میگیرید |
|---|---|---|
| ۱ | ارتباط با دیتابیس (PDO) | اتصال امن به MySQL، جلوگیری از SQL Injection |
| ۲ | مدیریت نشستها (Sessions) | ساخت سیستم لاگین/خروج، مدیریت دسترسی کاربران |
| ۳ | کار با فایلها (File Handling) | آپلود تصویر، خواندن و نوشتن در فایلها |
| ۴ | مدیریت خطاها (Error Handling) | استفاده از Try/Catch، لاگگیری خطاها |
| ۵ | مقدمهای بر شیگرایی (OOP) | کلاس، شیء، متد، ویژگیها |
| ۶ | ساختاردهی پروژه (MVC مقدماتی) | جداسازی منطق از ظاهر، فایلهای Config |
| ۷ | امنیت پیشرفته | هش کردن پسورد، محافظت در برابر XSS و CSRF |
| ۸ | کار با API (مقدماتی) | دریافت داده از API خارجی (cURL)، JSON |
| ۹ | پروژه نهایی سطح متوسط | ساخت وبلاگ کامل با قابلیت لاگین و مدیریت |



