روش های خطایابی در MVC

پنجشنبه 4 شهریور 1395

در این مقاله ما در مورد 6 روش برای مدیریت خطاها در MVC صحبت خواهیم کرد.در این مقاله همچنین ما در مورد بهترین شیوه برای خطایابی در MVC صحبت می کنیم.

 روش های خطایابی در MVC

روش 1: روش آسان

آسان ترین روش برای مدیریت خطایابی  در .NET استفاده از روش (استایل) سنتی می باشد. به عنوان مثال استفاده از بلوک try و catch.حال زمانی که خطا اتفاق میوفتد ، بلوک catch اجرا می شود و آن را به viewی خطا ، تغییر مسیر می دهد.

اما اگر از اینروش استفاده کنیم ،پس ما از مکانیسم درست و کاملی برای خطایابی در mvc استفاده نکرده ایم.در بخش های بعدی ما در مورد 5 روش مهم که  با استفاده از آن ها می توانیم از  ویژگی های مدیریت خطایابی در MVC ، استفاده کنیم.

public ActionResult SomeError()
{
try
{}
catch(Exception ex)
{return View("Error");}
}

روش2: بازنویسی (Override)کردن متد "OnException":

در این متد ما  می توانیم  رویداد مربوط به کنترلر  “OnException” را Override کنیم و “Result”  را  به عنوان نام view  تنظیم کنیم.این Viwe زمانی نمایش داده می شود که خطایی در این کنترلر رخ داده باشد.در کد زیر شما می توانید ببینید ما “Result”   را بر روی یک View به نام “Error” تنظیم کردیم.

همچنین ما خطا را تنظیم کردیم بنابراین می تواند در داخل View نمایش داده شود.

public class HomeController : Controller
 {
        protected override void OnException(ExceptionContext filterContext)
        {
            Exception ex = filterContext.Exception;
            filterContext.ExceptionHandled = true;

     var model = new HandleErrorInfo(filterContext.Exception, "Controller","Action");

     filterContext.Result = new ViewResult()
{
                ViewName = "Error",
                ViewData = new ViewDataDictionary(model)
     };

        }
}

برای نمایش خطای بالا در View ما میتوانیم از کد زیر استفاده کنیم.:

@Model.Exception;

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

روش 3: استفاده از صفت “HandleError”:

راه دیگر مدیریت کردن خطا ، استفاده از صفت " HandleError  " می باشد. پیاده سازی صفت " HandleError " دو مرحله ای می باشد:

مرحله1: ابتدا ما باید متد action را با صفت “HandleError” مانند شکل زیر بنویسیم.

public class HomeController : Controller
 {
        [HandleError()]
        public ActionResult SomeError()
        {
            throw new Exception("test");
        }
}

مرحله 2 : در فایل “Web.config” شما باید تگ “customErrors” را اضافه کنید و همانطور که در تکه کد زیر نشان داده شده آن را به Viewیی  به نام “Error” هدایت کنید.

<system.web>
<customErrors defaultRedirect="Error.cshtml" mode="On">
</customErrors>
</system.web>

در صورتی که شما می خواهید Viewهای مختلف خطا برای انواعexception  را داشته باشید شما می توانید action method را  با چندین صفت “HandleError” ، تنظیم کنید به صورتی که بتواند برای هر نوع خطا Viewی جداگانه برگرداند.

public class HomeController : Controller
{
        [HandleError(ExceptionType=typeof(ArithmeticException),View="Arthimetic")]
[HandleError(ExceptionType = typeof(NotImplementedException),View ="Error1")]
public ActionResult SomeError()
{
    
}
}

روش4: ارث بری از "HandleErrorAttribute"

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

 به منظور استفاده مجدد از منطق خطایابی در کنترلر ، ما می توانیم از کلاس “HandleErrorAttribute” ارث بری کنیم.و این کلاس را مانند یک صفت برای کنترلر تنظیم کنیم.

public class Err : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
        {
            Exception ex = filterContext.Exception;
            filterContext.ExceptionHandled = true;
var model = new HandleErrorInfo(filterContext.Exception, "Controller", "Action");

            filterContext.Result = new ViewResult()
            {
                ViewName = "Error1",
                ViewData = new ViewDataDictionary(model)
            };
        }
    }

روش5: مدیریت خطاهای HTTP:

همه تکنیک های  مدیریت exception در MVC ، تا کنون خطاهای HTTP را مدیریت نمی کنند مانند file not found ،  HTTP 500 error’s  و...

برای مدیریت خطای HTTP باید یک ورودی برای error action و error status code در نظر بگیریم که نحوه ی این کار در فایل configدر زیر نشان داده شده است.

<system.web>
<customErrors
                  mode="On" defaultRedirect="Error1">
<error statusCode="404" redirect="~/Testing/NoPageFound"/>
</customErrors>
</system.web> 

روش6:مدیریت Global Error در MVC

اگر شما مایل به انجام خطایابی Global در برنامه خود هستید شما می  توانید رویداد “Application_Error” را override کنید و از رویداد global error  یک عمل   response.redirect  انجام دهید. .بنابراین اگر مدیریت خطایابی در سطح کنترلر انجام نشود به فایل “Global.asax” منتقل می شود.

public class MvcApplication : System.Web.HttpApplication
{
        protected void Application_Error(object sender, EventArgs e)
        {
            Exception exception = Server.GetLastError();
            Server.ClearError();
            Response.Redirect("/Home/Error");
        }
}

بهترین روش چیست؟

بهترین روش، ترکیب روش4 و روش 6 می باشد.یک خطایاب ایجاد کنید که کلاس های آن از کلاس “HandleErrorAttribute” ارث بری کنند و به ترتیب آن ها را بر روی کنترلرها و متدهای action تنظیم می کند.بنابراین این خطایاب برای خطاهای کنترلرها و action ها اتفاق می افتد .

برای بهبود امنیت می توانیم خروجی هر خطای غیر منتظره و مدیریت نشده را با استفاده از فعال سازی Global error handling تنظیم کنیم که این کار با استفاده از رویداد Application_Error” که در روش 6 توضیح دادیم انجام می شود.

آموزش asp.net mvc

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید