در حال ارتباط با سرور...




لطفا نظرات و پيشنهادات خود را بمنظور ارتقاء کيفي هرچه بيشتر سايت با ما در ميان بگذاريد.

ویدیوها مقالات کتاب ها اخبار پرسش و پاسخ
برنامه‌های رومیزی مبتنی بر وب زبان های برنامه سازی پایگاه داده سیستم عامل شبکه 
مقاله بگذارید
توسط : hamedkh دسته بندی : مبتنی بر وب تاریخ : 1392-7-24 13:48:43

 

یکی از مهمترین وظایفی که بر عهده یک برنامه نویس است مدیریت خطا ها و استثناء ها در برنامه خود می باشد. خوشبختانه زیر ساخت لازم برای این کار در Yii Framewok  فراهم شده و در اختیار توسعه دهندگان قرار گرفته است. روش مدیریت خطا در Yii Framework بر مبنای مکانیزم موجود در PHP 5 پیاده سازی شده است. در این روش دو تابع مهم و اساسی مورد استفاده قرار می گیرد. یکی از آنها متد handleError است که مختص مدیریت اخطار هاست )شامل warning ها و notice ها). متد دیگری نیز در بحث مدیریت خطا ها وجود دارد که نام آن handleException می باشد و مسئول مستقیم مدیریت استثنائات در برنامه می باشد. توجه داشته باشید هنگامی که خطایی در تقاضای کاربر (request) رخ می دهد یکی از این دو تابع بر حسب نیاز، جریان کار را در دست می گیرد و عملیات لازم را انجام می دهد.

 

در زمان صدور یک درخواست توسط کاربر گرداننده های خطا (error handlers) باید بنوعی مسئول مدیریت و نظارت بر آن درخواست شوند. به بیان فنی تر باید ثبت نام (register) گردند. این کار توسط دو متد از فریم ورک با نام های set_exception_handler  و set_error_handler انجام می گیرد. در صورتی که نمی خواهید Yii کار مدیریت خطا را برای شما انجام دهد باید دو ثابت YII_ENABLE_ERROR_HANDLER و YII_ENABLE_EXCEPTION_HANDLER را برابر با false مقدار دهی کنید. دقت داشته باشید که این مقدار دهی باید در اسکریپت آغازین (entry script) برنامه صورت بگیرد.

 

بطور پیش فرض متد های handleError و HandleException در زمان وقوع رویداد های onError و onException فراخوانی می شود. در صورتی که ما هیچ گرداننده ای را برای مدیریت این رویداد ها تعریف نکرده باشید، بطور پیش فرض خود کامپوننت errorHandler مربوط به شیء application این کار را برای ما انجام خواهد داد.

 

براه انداختن استثناء :

دقت داشته باشید که براه اندازی استثناء در Yii Framework هیچ تفاوتی با انجام این کار در PHP ندارد. این کار را بسادگی با استفاده از کد زیر می توان انجام داد :

 

throw new ExceptionClass('ExceptionMessage');

بنظور راحتی کار در Yii Framework سه نوع کلاس استثناء پیاده سازی شده است که عبارتند از : CException ، CDbException  و CHttpException. کلاس CException یک کلاس عمومی است که تمامی استثنائات را در در بر می گیرد. کلاس CDbException کمی اختصاصی تر است و بطور خاص رویداد های مربوط به عملیات پایگاه داده را شامل می شود. کلاس CHttpException نیز آن دسته از استثنائات را در پوشش می دهد که مربوط به درخواست های Http و کد های خطای Http می شوند و باید به کاربر نهایی (end user) نمایش داده شوند.

 

توجه داشته باشید که یکی از ساده ترین و رایج ترین کار هایی که بمنظور گزارش عملیات اشتباه کاربران و نمایش آنها استفاده می شود براه اندازی استثنائات Http است. بعنوان مثال در شرایطی که کاربر یک شناسه (ID) نامعتبر را در URL قرار دهد می توانیم یک استثناء Http با کد 404 را براه بیاندازیم و آن را به کاربر نمایش دهیم.

 

// if post ID is invalid
throw new CHttpException(404,'The specified post cannot be found.');

نمایش خطا ها

هنگامی که خطایی رخ می دهد، باید به گونه ای آن را نمایش داد و کاربر را از آن مطلع ساخت. برای این منظور در هنگام وقوع خطا، خطا به کامپوننت CErrorHandler  فرستاده می شود تا نمایی (view) مناسب برای نمایش خطا انتخاب شود و خطا به کاربر نمایش داده شود. اگر نیاز به نمایش خطا به کاربر وجود داشته باشد، مثلا در شرایط که یک استثناء Http رخ دهد، معموملا از نمایی با نام errorXXX استفاده می شود که در اینجا XXX نماینده کد خطای Http است (کدهایی مانند 404، 400 و 500). گاهی اوقات خطا ها داخلی هستند و تنها نیاز است خود توسعه دهنده از ان با خبر گردد در چنین شرایطی از نمایی با نام exception استفاده می شود. در این شرایط بجای کد های Http، پشته فراخوانی (call stack) بهمراه شماره خطی که خطا در ان رخ داده اشت به توسعه دهنده نمایش داده می شود. در شرایطی که برنامه در حالت تولید (production mode) اجرا شود، تمامی خطا ها در نمای errorXXX نمایش داده می شود. در چنین شرایطی توصیه می شود برای آگاهی از جزئیات بیشتر خطا به فایل های لاگ خطا مراجعه شود.

 

همانطور که گفتیم در هنام وقوع یک خطا، کامپوننت CErrorHandler مسئول مدیریت و نمایش خطا به کاربر می شود. این کامپوننت باید نمایی (view) خاص را برای این منظور انتخاب نماید. روال انتخاب یک نمای مناسب برای خطا به ترتیب زیر صروت می گیرد :

  1. ابتدا این کامپوننت بدنبال فایل مورد نظر در شاخه WebRoot/themes/ThemeName/views/system می گردد.
  2. اگر فایل مورد نظر پیدا نشد سیستم این کار را در شاخه WebRoot/themes/ThemeName/views/system تکرار می کند.
  3. در نهایت در صورتی که فایل نما در مراحل قبلی پیدا نشود سیستم نمای مربوط در مسیر yii/framework/views را برای نمایش خطا انتخاب می کند.

 

در صورتی که بخواهیم تغییراتی در نمایش خطا انجام دهیم و آن را سفارشی (customize) کنیم باید خودمان فایلی با نام مناسب در شاخه view مربوط به برنامه و یا شاخه theme ایجاد کنیم و کد های خود را در آن فایل قرار دهیم. برای آگاهی از جزئیات این فایل ها می توانید سری به فایل های موجود در شاخه view مربوط به Yii بزنید.

 

مدیریت خطا توسط action ها :

در Yii Framework بمنظور سادگی کار می توانید از action ها برای مدیریت خطا و نمایش ان به کاربران استفاده کنید. برای این منظور ابتدا باید در فایل پیکربندی برنامه action مربوط به مدیریت خطا های برنامه خود را تعریف کنید. در مثال زیر Action با نام error از کنترولر site برای این کار تعریف شده است. توجه داشته باشید که با این کار در صورت وقوع هر گونه خطایی جریان برنامه بطور خودکار به این Action منتقل خواهد شد. البته شما می توانید هدایت خطا را به کنترلر مورد نظر خود منتقل کنید.

 

return array(
    ......
    'components'=>array(
        'errorHandler'=>array(
            'errorAction'=>'site/error',
        ),
    ),
);

پس از آنکه action ای برای هدایت خطا مشخص کردیم طبیعی است که باید آن را پیاده سازی کنیم.

 

public function actionError()
{
    if($error=Yii::app()->errorHandler->error)
        $this->render('error', $error);
}

در داخل این Action ابتدا جزئیات مربوط به خطا را با استفاده از CErrorHandler::error می گیریم. اگر این پارامتر خالی نباشد، نمایی با نامه error را به همراه این جزئیات رندر می کنیم. توجه داشته باشید که پارامتر error آرایه ای است که اطلاعات زیر را در خود دارد:

 

  • code: کد وضعیت خطای Http (404، 500 و ...).
  • type: نوع خطا ( مثلا خطا PHP error است یا CHttpException).
  • message: پیغام خطا.
  • file: نام فایلی که خطا در آن رخ داده است.
  • line: شماره خطی که خطا در آن رخ داده است.
  • trace: پشته فراخوانی (call stack).
  • source: محتویات کد های برنامه که خطا در آن رخ داده است.

 

همانطور که در مثال مشاهده کردید ما پیش از رندر کردن نمای مورد نظر، از خالی نبودن error مطمئن می شویم. علت این کار اینست که هر کاربری می تواند مستقیما اکشن مربوط به خطا را در برنامه ها صدا بزند. در این حالتی خطایی رخ نداده است در نتیجه error خالی خواهد بود.

 

از آنجایی که ما پارامتر error را به نما  پاس می کنیم، در نما می توانیم از طریق متغیر $error به جزئیات ان دسترسی داشته باشیم. نکته جالب توجه آنست که این جزئیات بطور خود کار در متغیر هایی با نام های مرتبط (مثلا $type، $code و ...) قرار می گیرند و بنابراین بطور مستقیم از طریق نام این متغییر ها قابل دسترسی می گردند.

 

موفق و پیروز باشید.

 

منبع : مدیریت خطا و استثناء در Yii framework

 

 

 

 

hamedkh
5.8 k     1     18     72
نظرات

آقا عالی دمتون گرم

آموزش زبان برنامه نویسی C#
آموزش jquery

آموزش زبان جاوا Java
آموزش زبان انگلیسی
آموزش برنامه نویسی C
آموزش برنامه نویسی C++
آموزش جی کوئری jQuery
آموزش زبان سی شارپ C#
آموزش برنامه نویسی اندروید
آموزش برنامه نویسی اندروید
آموزش زبان اسمبلی Assembly
آموزش جاوا اسکریپت JavaScript
آموزش برنامه نویسی به زبان PHP