ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

IExceptionFilter、IAsyncExceptionFilter

2022-05-08 19:01:16  阅读:261  来源: 互联网

标签:IExceptionFilter Exception context new using 异常 IAsyncExceptionFilter


IExceptionFilter在它的作用范围内,当程序发生异常,可以接收到异常,对异常进行统一的处理。

当程序同时继承了IExceptionFilter,IAsyncExceptionFilter,则优先处理异步方法OnExceptionAsync

1、新建过滤器类CustomExceptionFilterAttribute继承Attribute, IExceptionFilter

 1 using Microsoft.AspNetCore.Mvc;
 2 using Microsoft.AspNetCore.Mvc.Filters;
 3 using Microsoft.AspNetCore.Mvc.ModelBinding;
 4 using Microsoft.AspNetCore.Mvc.ViewFeatures;
 5 
 6 namespace Project6.Utility.Filters
 7 {
 8     public class CustomExceptionFilterAttribute : Attribute, IExceptionFilter
 9     {
10         private readonly IModelMetadataProvider _IModelMetadataProvider;
11         public CustomExceptionFilterAttribute(IModelMetadataProvider modelMetadataProvider)
12         {
13             _IModelMetadataProvider= modelMetadataProvider;
14         }
15 
16         public void OnException(ExceptionContext context)
17         {
18            
19             if(IsAjaxRequest(context.HttpContext.Request))  //判断是否是Ajax异步请求,返回一个JSON
20             {
21                 context.Result = new JsonResult(new
22                 {
23                     Sucess = false,
24                     Message = context.Exception.Message
25                 });
26             }
27             else  //返回页面
28             {
29                 ViewResult result = new ViewResult { ViewName="~/Views/Shared/Error.cshtml"};
30                 result.ViewData = new ViewDataDictionary(_IModelMetadataProvider, context.ModelState);
31                 result.ViewData.Add("Exception", context.Exception);
32                 context.Result = result;  //赋值给Result程序就不在往后执行了
33             }
34         }
35 
36         //public Task OnExceptionAsync(ExceptionContext context)
37         //{
38         //    throw new NotImplementedException();
39         //}
40 
41         private bool IsAjaxRequest(HttpRequest request)
42         {
43             string header = request.Headers["X-Requested-With"];
44             return "XMLHttpRequest".Equals(header);
45         }
46     }
47 }
View Code

2、新建控制器CustomExceptionFilterController

 1 using Microsoft.AspNetCore.Mvc;
 2 using Project6.Utility.Filters;
 3 
 4 namespace Project6.Controllers
 5 {
 6     public class CustomExceptionFilterController : Controller
 7     {
 8         [TypeFilter(typeof(CustomExceptionFilterAttribute))]
 9         public IActionResult Index()
10         {
11             throw new Exception("抛出个异常测试");
12         }
13     }
14 }
View Code

3、修改/Views/Shared/Error.cshtml

@model ErrorViewModel
@{
    ViewData["Title"] = "Error";
    Exception exception = ViewData["Exception"] as Exception;
}

<h1 class="text-danger">Error.</h1>
@if(exception != null){
    <h1>@exception.Message</h1>
}
View Code

4、执行程序/CustomExceptionFilter

可以发现当程序抛出异常,会进入CustomExceptionFilterAttribute-->OnException,在OnException里面做统一处理。返回异常结果。

5、IExceptionFilter的作用范围

  a、action出现没有处理的异常

  b、Service层出现的异常,因为异常是从下往上抛出,Service属于下层

  c、构造器函数出现的异常

 

6、IExceptionFilter捕捉不到的异常

  a、Action里面已经有try\catch捕捉异常,则不会在进入IExceptionFilter

  b、View视图层抛出的异常

  c、不存在的URL,404捕捉不到

  d、其它Filter中出现的异常,有的能捕捉到,有的不能

标签:IExceptionFilter,Exception,context,new,using,异常,IAsyncExceptionFilter
来源: https://www.cnblogs.com/handsomeziff/p/16246424.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有