asp.net core MVC 全局過濾器之ExceptionFilter過濾器


這個是網上搜到的,覺的說的聽清楚的,轉發下,原文地址 https://www.jb51.net/article/121970.htm

簡介

異常過濾器,顧名思義,就是當程序發生異常時所使用的過濾器。用於在系統出現未捕獲異常時的處理。

實現一個自定義異常過濾器

自定義一個全局異常過濾器需要實現IExceptionFilter接口

 
1
2
3
4
5
6
7
public class HttpGlobalExceptionFilter : IExceptionFilter
   {
     public void OnException(ExceptionContext context)
     {
       throw new NotImplementedException();
     }
   }

IExceptionFilter接口會要求實現OnException方法,當系統發生未捕獲異常時就會觸發這個方法。OnException方法有一個ExceptionContext異常上下文,其中包含了具體的異常信息,HttpContext及mvc路由信息。系統一旦出現未捕獲異常后,比較常見的做法就是使用日志工具,將異常的詳細信息記錄下來,方便修正調試。下面是日志記錄的實現。  

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
   /// <summary>
   /// 全局異常過濾器
   /// </summary>
   public class HttpGlobalExceptionFilter : IExceptionFilter
   {
     readonly ILoggerFactory _loggerFactory;
     readonly IHostingEnvironment _env;
 
     public HttpGlobalExceptionFilter(ILoggerFactory loggerFactory, IHostingEnvironment env)
     {
       _loggerFactory = loggerFactory;
       _env = env;
     }
 
     public void OnException(ExceptionContext context)
     {
       var logger = _loggerFactory.CreateLogger(context.Exception.TargetSite.ReflectedType);
 
         logger.LogError( new EventId(context.Exception.HResult),
         context.Exception,
         context.Exception.Message);
 
         var json = new ErrorResponse( "未知錯誤,請重試" );
 
         if (_env.IsDevelopment()) json.DeveloperMessage = context.Exception;
 
         context.Result = new ApplicationErrorResult(json);
         context.HttpContext.Response.StatusCode = ( int )HttpStatusCode.InternalServerError;
 
       context.ExceptionHandled = true ;
     }
 
public class ApplicationErrorResult : ObjectResult
   {
     public ApplicationErrorResult( object value) : base (value)
     {
       StatusCode = ( int )HttpStatusCode.InternalServerError;
     }
   }
 
public class ErrorResponse
   {
     public ErrorResponse( string msg)
     {
       Message = msg;
     }
     public string Message { get ; set ; }
     public object DeveloperMessage { get ; set ; }
   }

注冊全局過濾器

過濾器已經編寫完畢,接下來就需要在asp.net core MVC中注冊。找到系統根目錄Startup.cs文件,修改ConfigureServices方法如下

 
1
2
3
4
services.AddMvc(options =>
      {
        options.Filters.Add<HttpGlobalExceptionFilter>();
      });

測試

在請求中拋出一個異常

日志正確捕獲到異常信息

瀏覽器返回500錯誤,並且返回自定義的錯誤信息。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM