ویرگول
ورودثبت نام
میلاد نعمت پور
میلاد نعمت پور
خواندن ۳ دقیقه·۴ سال پیش

Exception Filter - فیلتر استثنائات

فیلتر استثنائات به شما اجازه می دهد بدون اینکه در کدتون از بلاک try..catch استفاده کنید می توانید برای نمایش خطاها در هر متدی از این روش استفاده کنید.

فیلتر استثنائات را می توانید بر روی کنترلر، متدهای اکشن،مدل صفحه(razor page) و همچنین متدهای هندلر اعمال کنید.

زمانی که استثنائات توسط اندپوینت(end point)یا اکشن، پیچ و result filter مدیریت نشده باشند بر روی اندپوینت اعمال می شود.Exception filter از اینترفیس IExceptionFilter پیاده سازی می شوند.

Namespace Microsoft.AspNetCore.Mvc.Filters { Public interface IExceptionFilter:IFilterMetadata { void OnException(ExceptionContext context); } }

متد OnExceptionAsync از نوع غیرهمزمان و متد OnException از اینترفیس IExceptionFilter زمانی خوانده می شوند که مدیریت خطای هندل نشده وجود داشته باشد. هر دو اینترفیس ها از ExceptionContext  گرفته می شوند که خود آن از filtercontext مشتق شده است.

ساخت یک فیلتر استثنا

فیلترهای استثنا می توانند از یک فیلتر  یا از طریق اینترفیس های IExcptionFilter یا IAsyncException مشتق شوند.

در صفحع خطا برای خطای خاص از فیلتر استثنا استفاده می شود تا به وسیله آن کاربر بتواند اطلاعات مفیدی را به دست آورد.

یک پوشه جدید به نام فیلتر  و در آن یک فایل به نام RangeExceptionAttribute ایجاد کنید کدهای زیر را در آن بنویسید:

using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ViewFeatures; using System; namespace WebApp.Filters { public class RangeExceptionAttribute : ExceptionFilterAttribute { public override void OnException(ExceptionContext context) { if (context.Exception is ArgumentOutOfRangeException) { context.Result = new ViewResult() { ViewName = &quot/Views/Shared/Message.cshtml&quot, ViewData = new ViewDataDictionary( new EmptyModelMetadataProvider(), new ModelStateDictionary()) {Model = @&quotThe data received by the application cannot be processed&quot}}; }}}}

در کد بالا که از کلاس ExceptionFilterAttribute مشتق شده و از متد OnException استفاده می کنم که ورودی آن یک ExceptionContext می باشد در آن بررسی کردم که نوع استثنایی که هنگام خروجی به کاربر نشان می دهد اگر از نوع ArgumentOutOfRangeException بود پارامترهای شامل آدرس نام نمایش خطا و ViewData آن را برابر با متنی که می خواهیم نمایش دهیم می نویسیم.

در کنترلر یا razor page کدهای زیر را بنویسید

[RangeException] public ViewResult GenerateException(int? id) { if (id == null) { throw new ArgumentNullException(nameof(id)); } else if (id > 10) { throw new ArgumentOutOfRangeException(nameof(id)); } else { return View(&quotMessage&quot, $&quotThe value is {id}&quot); } }

متد GenerateException یک ورودی اپشینال از نوع int  از درخواست url می پذیرد  ما به طور مثال یک عدد بالاتر از مقدار 10 به ان بایند می کنیم وارد بدنه if دومی خواهد شد که یک استثنا به صورت دستی ایجاد کردیم و یک خطا از نوع ArgumentOutOfRange برای این مقدار ورودی اتفاق خواهد افتاد و چون بالای اکشن از فیلتر RangeException استفاده شده است بنابراین خطای که در فیلتر بالا نوشته ایم نمایش خواهد داد همانند تصویر زیر.


exception filterfilter in mvc corefilter asp coreexceptionبرنامه نویسی
شاید از این پست‌ها خوشتان بیاید