روش های خطایابی در MVC
پنجشنبه 4 شهریور 1395در این مقاله ما در مورد 6 روش برای مدیریت خطاها در 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
- ASP.net MVC
- 3k بازدید
- 10 تشکر