کنترل خطا در ASP.NET Core MVC – جلسه ۵۷

Error and Exception Handling - Session57

در این جلسه به بررسی کنترل خطا در ASP.NET Core MVC و یا همان Exception Handling خواهیم پرداخت. همچنین به آموزش روش نمایش پیغام با ظاهرشخصی‌سازی شده در صورت بروز خطا نیز خواهیم پرداخت. اگر به خاطر داشته باشید، در جلسه 56 توضیحات مختصری درباره روش کنترل خطا ارائه دادیم که در این جلسه قصد داریم به شرح کامل این موضوع بپردازیم.

کنترل خطا 404

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

خطای 404 در مرورگر
خطای 404 در مرورگر
خطای 404 کنترل شده توسط وب اپلیکیشن
خطای 404 کنترل شده توسط وب اپلیکیشن

برای کنترل خطای 404 در وب اپلیکشن‌های ASP.NET Core MVC میتوان از Middleware های مناسب استفاده نمود. ما در این جلسه به معرفی سه میان‌افزار میپردازیم و معایب و مزایای آن‌ها را شرح خواهیم داد.

ابتدا میتوانیم از میان‌افزار UseStatusCodePages استفاده نماییم. همانگونه که قبلا در جلسه هفتم در خصوص میان‌افزارها صحبت کردیم، برای استفاده از آن باید از متد Configure در کلاس Startup استفاده نماییم. استفاده از این میان‌افزار بسیار ساده میباشد ولی نتیجه آن مسلما نیازهای تعریف شده مارا تامین نمیکند.

روش دوم استفاده از میان‌افزار UseStatusCodePagesWithRedirects می‌باشد. برای پیاده سازی آن، علاوه بر استفاده از میان‌افزار در متد Configure از کلاس Startup نیاز به ایجاد کنترلر و ویو مناسب برای نمایش پیغام خطا می‌باشد. پیاده‌سازی این روش پیچیدگی بیشتری نسبت به روش اول دارد ولی نتیجه آن نیازهای وب‌اپلیکشن را برطرف میکند. البته در صورت استفاده از این Middleware وب اپلیکشن کد 404 را باز نمیگرداند. همچنین URL درخواست شده در مرورگر تغییر خواهد کرد.

برای جلوگیری از مشکلات بیان شده در روش دوم، بهتر است از میان‌افزار UseStatusCodePagesWithReExecute استفاده نماییم. پیاده سازی و نمای خروجی آن کاملا مشابه با روش دوم میباشد ولی وب اپلیشکن این بار کد 404 را بازمی‌گرداند و URL نیز تغییر نخواهد کرد.

برای پیاده سازی آن ابتدا باید درون متد Configure از کلاس Startup میان‌افزار مربوطه را وارد نماییم.

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage(new DeveloperExceptionPageOptions { SourceCodeLineCount = 10 });
            }
            else
            {
                app.UseStatusCodePagesWithReExecute("/Error/{0}");
            }
            app.UseStaticFiles();
            app.UseRouting();         
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapDefaultControllerRoute();
            });
        }

سپس میبایست یک کنترلر و اکشن متد برای نمایش خطا ایجاد نماییم.

    public class ErrorController : Controller
    {
        [Route("Error/{statusCode}")]
        public IActionResult NotFound(int statusCode)
        {
            switch (statusCode)
            {
                case 404:
                    ViewBag.ErrorTitle = "The Requested Page is not Exist";
                    break;
                default:
                    ViewBag.ErrorTitle = "Unexpected Error";
                    break;

            }
            return View("Error");
        }
    }

حالا جهت نمایش خطا میبایست یک نما در مسیر Views/Shared ایجاد نماییم.

@{
    ViewBag.Title = "Error Page";
}
<h1 class="alert alert-danger my-5">
    @ViewBag.ErrorTitle
</h1>
<h4 class="alert alert-danger my1">
    @ViewBag.ErrorMessage
</h4>



با استفاده از این تغییرات می‌توانیم نمایش خطای 404 را کنترل نماییم.

کنترل خطای غیرمنتظره در ASP.NET Core

در تمامی وب‌اپلیکشن‌ها با تمامی کنترل‌های انجام شده باز هم ممکن است در شرایط خاص خطایی صورت گیرد. به این نوع خطا‌ها،خطاهای غیر منتظره یا Exceptional Error گفته میشود. در صورت بروز این خطاها امکان توقف برنامه و نمایش خطای سیستمی وجود دارد. برای جلوگیری از این اتفاق میتوانیم از بلاک کد Try و Catch استفاده نماییم. همچنین برای نمایش پیغام خطای مناسب در صورت بروز این دسته از مشکلات، میتوانیم از میان‌افزار UseExceptionHandlerاستفاده کنیم.

روش استفاده از آن تقریبا مشابه با روش کنترل خطای 404 میباشد. پس ابتدا نیاز به استفاده از میان‌افزار در متد Configure از کلاس Startup میباشد.

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage(new DeveloperExceptionPageOptions { SourceCodeLineCount = 10 });
            }
            else
            {
                app.UseExceptionHandler("/Error");
                app.UseStatusCodePagesWithReExecute("/Error/{0}");
            }
            app.UseStaticFiles();
            app.UseRouting();         
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapDefaultControllerRoute();
            });
        }

پس از آن، برای این منظور درون کنترلر Error که در مرحله قبل شرح دادیم یک اکشن متد جدید تعریف مینیم.

        [Route("Error")]
        public IActionResult ExceptionError()
        {
            ViewBag.ErrorTitle = "Unexpected Error Occured";
            ViewBag.ErrorMessage = "Please report this error to the website administrator";
            return View("Error");
        }

سپس با استفاده از نمای قبلی میتوانیم پیغام خطای مناسب را به کاربر نمایش دهیم.

نمایش پیغام خطای خاص برای خطاهای مشخص

گاهی برخی از خطاها از قبل پیشبینی شده است و بروز آنها توسط توسعه دهنده پیش بینی شده است. مانند خطای حذف رکورد والد در صورت استفاده ازخاصیت Restricted در On Delete Action. در جلسه گذشته برای عدم نمایش خطا از بلاک کد Try و Catch استفاده نمودیم. اما کاربر هم پیغام مناسبی برای عدم حذف رکورد دریافت ننمود. برای نمایش پیغام مناسب، میتوانیم تغییراتی در ریپازیتوری، کنترلر و نمای Error اعمال نماییم.

ما میدانیم که خطای مذکور مربوط به بروزرسانی پایگاه داده بعد از حذف رکورد مورد اشاره میباشد. در نتیجه در بلاک Catch تعیین میکنیم که خطاهای مرتبط را شناسایی نماید.

        public IEnumerable<Category> Delete(IEnumerable<int> DeleteList)
        {
            try
            {
                var DeleteCatList = webAppDBContext.Categories.Where(z => DeleteList.Contains(z.ID)).ToList();
                webAppDBContext.Categories.RemoveRange(DeleteCatList);
                webAppDBContext.SaveChanges();
                return DeleteCatList;
            }
            catch (DbUpdateException ex)
            {
                return null;
            }

        }

پس از آن درون کنترلر با توجه به شرایط تعیین شده میتوانیم تشخیص دهیم که آیا خطای مربوطه صورت گرفته است یا خیر. سپس در صورت بروز خطای مورد نظر پیغام مناسب توسط ViewBag به نمای Error ارسال میگردد.

        [HttpPost]
        public IActionResult Delete(IEnumerable<int> SelectedCatDelete)
        {

            var delList = categoryRepository.Delete(SelectedCatDelete);
            if(delList == null)
            {
                ViewBag.DelError = "Yes";
                ViewBag.DelTitle = "Delete operation has not been completed";
                ViewBag.DelMessage = "This record can not be deleted, beacuse one or more cost record use this category.";
                return View("Error");
            }
            return RedirectToAction("Index");
        }

به علاوه، بایدتغییراتی درون نما ایجاد نماییم تا بتوانیم تمامی خطاها را با یک نما نمایش دهیم.

@{
    ViewBag.Title = "Error Page";
}
@if (ViewBag.DelError == "Yes")
{
    <h1 class="alert alert-danger my-5">
        @ViewBag.DelTitle
    </h1>
    <h4 class="alert alert-danger my1">
        @ViewBag.DelMessage
    </h4>
}
else
{
    <h1 class="alert alert-danger my-5">
        @ViewBag.ErrorTitle
    </h1>
    <h4 class="alert alert-danger my1">
        @ViewBag.ErrorMessage
    </h4>
}


در صورت نیاز به جزئیات بیشتر، میتوانید ویدئو آموزشی این جلسه را تماشا نمایید. همچنین برای آگاهی از جلسات بعدی این دوره آموزشی، ما را در اینستاگرام، تلگرام، یوتیوب و آپارات دنبال کنید. ضمنا لیست کامل جلسات در این قسمت در دسترس شما میباشد و سورس کد این جلسه را میتوانید از GitHub ما دانلود نمایید.

تماشای ویدیو در یوتیوب ما

دانلود اسلایدهای آموزشی این جلسه از اینجا

برچسب ها

0 0 رای ها
امتیازدهی به مقاله
اشتراک در
اطلاع از
guest
0 نظرات
بازخورد (Feedback) های اینلاین
مشاهده همه دیدگاه ها
0
افکار شما را دوست داریم، لطفا نظر دهید.x