.net core 异常过滤器的使用
CustomExceptionFilterAttribute.cs
public class CustomExceptionFilterAttribute : ExceptionFilterAttribute { private readonly ILogger<CustomExceptionFilterAttribute> _logger; private readonly IModelMetadataProvider _modelMetadataProvider; public CustomExceptionFilterAttribute(ILogger<CustomExceptionFilterAttribute> logger, IModelMetadataProvider modelMetadataProvider) { _logger = logger; _modelMetadataProvider = modelMetadataProvider; } /// <summary> /// 发生异常时 进入 /// </summary> /// <param name="context"></param> public override void OnException(ExceptionContext context) { this._logger.LogError($"在响应 {context.HttpContext.Request.Path} 时出现异常,信息:{context.Exception.Message}"); if (!context.ExceptionHandled) //异常未被处理 { if (this.IsAjaxRequest(context.HttpContext.Request))//ajax请求 { context.Result = new JsonResult(new { Result = false, Msg = "发生错误,请联系管理员", DebugMessage = context.Exception.Message });//中断式---请求到这里结束了,不再继续Action } else { var result = new ViewResult { ViewName = "~/Views/Shared/Error.cshtml" }; result.ViewData = new ViewDataDictionary(_modelMetadataProvider, context.ModelState); result.ViewData.Add("Exception", context.Exception.Message); context.Result = result; } context.ExceptionHandled = true;//异常已被处理 } } private bool IsAjaxRequest(HttpRequest request) { string header = request.Headers["X-Requested-With"]; return "XMLHttpRequest".Equals(header); } }
Error.cshtml
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width" /> <title>错误</title> </head> <body> <hgroup> <h1>错误。</h1> <h2>处理你的请求时出错。</h2> <h3>异常信息:@ViewData["Exception"]</h3> @{ Console.WriteLine(ViewData["Exception"]); } </hgroup> </body> </html>
Ajax请求:
@{ ViewData["Title"] = "Home Page"; } <div class="text-center"> <h1 class="display-4">Welcome</h1> <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p> <button id="b01" type="button">Change Content</button> </div> @section scripts{ <script> $("#b01").click(function () { $.ajax({ url: 'http://localhost:5177/Custom',//地址 dataType: 'json',//数据类型 type: 'Post',//类型 timeout: 2000,//超时 //请求成功 success: function (data, status) { console.log(data.result); console.log(data.msg); console.log(data.debugMessage); } }); }); </script> }
第一种使用方式(全局注册):
public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(options => { options.Filters.Add(typeof(CustomExceptionFilterAttribute)); //全局注册异常 }); services.AddControllersWithViews(); }
第二种方式(TypeFilter):
[TypeFilter(typeof(CustomExceptionFilterAttribute))] public class CustomController : Controller { public IActionResult Index() { Console.WriteLine("Custom/Index"); int i = 0; int k = 10; int j = k / i; //这里会异常 return View(); } }
第三种方式(ServiceFilter):
[ServiceFilter(typeof(CustomExceptionFilterAttribute))] public class CustomController : Controller { public IActionResult Index() { Console.WriteLine("Custom/Index"); int i = 0; int k = 10; int j = k / i; //这里会异常 return View(); } } public void ConfigureServices(IServiceCollection services) { services.AddTransient<CustomExceptionFilterAttribute>(); //注册 services.AddControllersWithViews(); }
第四种方式(IFilterFactory)
public class CustomIOCFilterFactoryAttribute : Attribute, IFilterFactory { Type _FilterType = null; public CustomIOCFilterFactoryAttribute(Type FilterType) { _FilterType = FilterType; } public bool IsReusable => true; public IFilterMetadata CreateInstance(IServiceProvider serviceProvider) { return (IFilterMetadata)serviceProvider.GetService(this._FilterType); } } [CustomIOCFilterFactoryAttribute(typeof(CustomExceptionFilterAttribute))] public class CustomController : Controller { public IActionResult Index() { Console.WriteLine("Custom/Index"); int i = 0; int k = 10; int j = k / i; //这里会异常 return View(); } } public void ConfigureServices(IServiceCollection services) { services.AddTransient<CustomExceptionFilterAttribute>(); //注册 services.AddControllersWithViews(); }