هندل کردن خطاها

مجتبی پاکزاد کدایگنایتر 3.1.9 در حال تکمیل رایگان

کدایگنایتر امکان این را به شما می‌دهد تا با استفاده از فانکشن‌هایی که در ادامه توضیح داده شده است، گزارش خطا (error reporting) را به اپلیکیشن‌های خود اضافه کنید. علاوه بر این، کدایگنایتر یک کلاس گزارش‌دهی خطا (error logging) نیز دارد که امکان ذخیره پیام‌های اشکال‌زدایی (debugging) و خطا در فایل‌های متنی را فراهم می‌کند.

توجه

کدایگنایتر به صورت پیش‌فرض، کلیه خطاهای پی‌اچ‌پی را نمایش می‌دهد. احتمالا در هنگامی که توسعه اپلیکیشن شما به پایان رسید، بخواهید این رفتار را تغییر دهید. در ابتدای فایل index.php، می‌توانید فانکشن error_reporting() را بیابید. در صورتی که خطایی وجود داشته باشد، غیرفعال کردن گزارش‌دهی خطا، منجر به جلوگیری از بازنویسی فایل‌های گزارش (log files) نخواهد شد.

در کدایگنایتر برخلاف اغلب سیستم‌ها، فانکشن‌ها اینترفیس‌هاس رویه‌گرای ساده‌ای هستند که به صورت گلوبال در کل اپلیکشن در دسترس هستند. این رویکرد، این امکان را به پیام‌های خطا می‌دهد تا بدون نگرانی درباره محدوده دسترسی کلاس/فانکشن تولید شوند.

هرگاه بخشی از هسته اپلیکیشن، فانکشن exit() را فراخوانی کند، کدایگنایتر یک کد وضعیت (Status code) نیز برمی‌گرداند. این کد وضعیت با کد وضعیت HTTP تفاوت دارد و در نقش یک اطلاع‌رسان، به بقیه پردازش‌هایی ارسال خواهد شد که ناظر بر اجرای اسکریپت هستند و بررسی می‌کنند که آیا اسکریپت با موفقیت اجرا شده است یا اگر با موفقیت اجرا نشده است، با چه نوع مشکلی مواجه شده است که باعث توقف آن شده است. این مقادیر در application/config/constants.php تعریف شده‌اند. گرچه کدهای وضعیت خروج، بیشترین کاربرد را در تنظیمات CLI دارند، بازگرداندن کدهای مناسب به سرور کمک می‌کند تا اسکریپت و وضعیت سلامت اپلیکیشن‌تان را تحت نظر داشته باشد.

فانکشن‌های زیر به شما کمک می‌کند تا خطاهای مورد نظرتان را تولید کنید:

show_error($message, $status_code, $heading = 'An Error Was Encountered')
پارامترها
  • $message نوع mixed (بیش از یک نوع می‌تواند باشد) - پیام خطا
  • $status_code نوع عدد صحیح - کد وضعیت پاسخ HTTP
  • $heading نوع استرینگ - عنوان صفحه خطا
مقدار بازگشتی ندارد

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

application/views/errors/html/error_general.php

یا قالب زیر، اگر اسکریپت از طریق CLI اجرا شده باشد:

application/views/errors/cli/error_general.php

پارامتر اختیاری $status_code تعیین می‌کند که کدام کد وضعیت HTTP باید همراه خطا ارسال شود. اگر $status_code کمتر از 100 باشد، مقدار 500 برای کد وضعیت HTTP سِت می‌شود و مقدار $status_code + EXIT__AUTO_MIN نیز برای کد وضعیت خروج سِت خواهد شد. اگر این مقدار بزرگتر از EXIT__AUTO_MAX باشد یا اگر $status_code مقدار 100 یا بیشتر داشته باشد، مقدار EXIT_ERROR برای کد وضعیت خروج سِت خواهد شد. برای اطلاعات بیشتر application/config/constants.php را ببینید.

show_404($page = '', $log_error = TRUE)
پارامترها
  • $page نوع استرینگ - استرینگ URI
  • $log_error نوع بولین - آیا از خطاها لاگ تهیه شود
مقدار بازگشتی ندارد

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

application/views/errors/html/error_404.php

یا قالب زیر، اگر اسکریپت از طریق CLI اجرا شده باشد:

application/views/errors/cli/error_404.php

این فانکشن انتظار دارد که پارامتری که به آن پاس داده می‌شود، مسیر فایل صفحه‌ای باشد که یافت نشده است. کد وضعیت خروج به EXIT_UNKNOWN_FILE سِت خواهد شد. توجه کنید که اگر کنترلر مورد نظر یافت نشود، کدایگنایتر به صورت خودکار، پیام 404 نمایش می‌دهد.

کدایگنایتر به صورت خودکار همه فراخوانی‌های show_404() را لاگ می‌کند. اگر مقدار اختیاری پارامتر دوم را FALSE قرار دهید، کدایگنایتر از لاگ کردن آن فراخوانی چشم‌پوشی می‌کند.

log_message($level, $message)
پارامترها
  • $level نوع استرینگ - سطح لاگ؛ که می‌تواند error یا debug یا info باشد
  • $message نوع استرینگ - پیامی برای لاگ
مقدار بازگشتی ندارد

این فانکشن امکان این را به شما می‌دهد تا پبام‌هایی را در فایل‌های لاگ خود بنویسید. برای پارامتر اول باید یکی از سه سطح لاگ (debug یا error یا info) را قرار دهید که نشان‌دهنده نوع پیام است و برای پارامتر دوم نیز خود پیام را باید قرار دهید.

مثال

if ($some_var == '')
{
        log_message('error', 'Some variable did not contain a value.');
}
else
{
        log_message('debug', 'Some variable was correctly set');
}

log_message('info', 'The purpose of some variable is to provide some value.');

سه نوع پیام وجود دارد:

  1. پیام‌های خطا (Error Messages). این نوع پیام‌ها، پیام‌های خطا واقعی هستند، مانند خطاهای PHP و یا خطاهای کاربر.
  2. پیام‌های دیباگ (Debug Messages). این نوع پیام‌ها به دیباگ برنامه کمک می‌کنند. برای مثال اگر یک کلاس لود شد، می‌توانید لود شدن آن را به عنوان پیام دیباگ ثبت کنید تا در هنگام بررسی لاگ‌ها راحت‌تر متوجه شوید که این کلاس لود شده یا نه.
  3. پیام‌های اطلاعاتی (Informational Messages). این پیام‌ها کمترین اولویت را دارند و صرفا اطلاعاتی درباره برخی پردازش‌ها ارائه می‌دهند.

توجه

برای اینکه فایل‌های لاگ در عمل نیز نوشته شوند، باید دایرکتوری logs/ قابل نوشتن باشد. علاوه بر این، باید با مقداردهی $config['log_threshold'] که در application/config/config.php قرار دارد، آستانه لاگ کردن را مشخص کنید. برای مثال ممکن است فقط مقدار خطاها را بخواهید لاگ کنید و نه دو نوع دیگر را. اگر مقدار این متغییر را 0 قرار دهید، هیچ لاگی ثبت نخواهد شد.

منبع
Error Handling