دوره‌ها / آموزش جامع PHP (از صفر تا استادی) / مدیریت خطا/استثنا (PHP Exceptions)

مدیریت خطا/استثنا (PHP Exceptions)

30 دقیقه Article

استثناها (Exceptions): مدیریتِ هوشمندانه‌یِ بحران 🚨🛡️

در برنامه‌نویسیِ حرفه‌ای، ما اجازه نمی‌دهیم برنامه با یک خطا کراش کند. در عوض، خطا را "می‌گیریم" و به شکلِ مناسبی آن را مدیریت می‌کنیم.

ساختارِ Try...Catch

کدی که ممکن است خطا بدهد را در try می‌گذاریم و در صورتِ بروزِ خطا، کنترل به بخشِ catch منتقل می‌شود.

{code_block('try {\n echo divide(5, 0);\n} catch(Exception $e) {\n echo "خطا: " . $e->getMessage();\n}')}

پرتاب کردنِ خطا (Throw):

شما می‌توانید در منطقِ برنامه‌یِ خودتان، هر جا که لازم بود یک خطا تولید کنید:

{code_block('if ($val < 0) { throw new Exception("مقدار نباید منفی باشد"); }')}

بلاکِ Finally:

کدی که در finally قرار بگیرد، چه خطا رخ دهد و چه ندهد، در انتها اجرا خواهد شد (عالی برایِ بستنِ اتصالاتِ دیتابیس).

سلسله مراتبِ خطاها: در PHP 7 به بعد، اکثرِ خطاهایِ سیستمی هم به جایِ کراش دادنِ کلِ سایت، به صورتِ Throwable پرتاب می‌شوند که قابلِ گرفتن هستند.
نمایشِ پیغام به کاربر: هرگز متنِ خامِ خطا (Stack Trace) را به کاربرانِ عادی نشان ندهید. این کار اطلاعاتِ حساسِ ساختارِ سرورِ شما را برایِ هکرها فاش می‌کند. فقط یک پیغامِ دوستانه نشان دهید و خطا را در سرور لاگ کنید.

ساخت استثنایِ شخصی:

می‌توانید کلاسی بسازید که از Exception ارث‌بری کند تا خطاهایِ اختصاصیِ خودتان (مثلاً PaymentException) را داشته باشید.

<hr style="margin: 50px 0; border: 0; border-top: 1px dashed rgba(255,255,255,0.1);">

بخش تخصصی: مهندسی پیشرفته و امنیت در PHP 🐘⚙️

درکِ عمیقِ مفاهیمِ پیشرفته، تفاوتِ بینِ یک کدنویسِ معمولی و یک معمارِ نرم‌افزار را رقم می‌زند.

۱. بهینه‌سازی I/O و بافرینگ

در هنگامِ کار با فایل‌هایِ حجیم، هرگز کلِ فایل را به یکباره در حافظه (RAM) بارگذاری نکنید. استفاده از Streams و توابعِ fopen/fgets به شما اجازه می‌دهد فایل را خط به خط پردازش کنید که باعث می‌شود مصرفِ حافظه همیشه در کمترین سطحِ ممکن باقی بماند.

۲. امنیتِ نشست‌ها (Session Security)

مهم‌ترین خطر در مدیریتِ کاربران، Session Hijacking است. همیشه بعد از لاگین کردنِ کاربر، از session_regenerate_id(true) استفاده کنید تا شناسه‌یِ نشستِ قبلی باطل شود. همچنین فلگ‌هایِ HttpOnly و Secure را برای کوکی‌ها فعال کنید.

۳. استانداردهایِ مدرن و Autoloading

در پروژه‌هایِ بزرگ، استفاده از include دستی فاجعه‌بار است. استانداردِ PSR-4 و استفاده از Composer به شما اجازه می‌دهد کلاس‌ها را فقط در زمانی که واقعاً نیاز هستند بارگذاری کنید (Lazy Loading)، که سرعتِ لود شدنِ کلِ اپلیکیشن را به شدت بالا می‌برد.

نکته استراتژیک: به جایِ استفاده از توابعِ سنتی، سعی کنید به سمتِ Object-Oriented Programming (OOP) حرکت کنید. اکثرِ کتابخانه‌هایِ پیشرفته‌یِ PHP مثل DateTime و PDO از این پارادایم استفاده می‌کنند.

تمرین‌های عملی

برای تثبیت یادگیری این درس تمرین‌های زیر را حل کنید

گرفتنِ خطا Medium
سوال تمرین

ساختارِ try...catch را برای تابعی که ممکن است خطایِ Exception بدهد بنویسید و در بخشِ catch، پیغامِ خطا را با $e->getMessage() چاپ کنید.

پاسخ تمرین
PHP
<?php
try {
  throw new Exception("Error occured");
} catch(Exception $e) {
  echo $e->getMessage();
}
?>

آماده رفتن به درس بعدی هستید؟

این درس را به پایان رساندید و می‌توانید به درس بعدی بروید.