asp.net之ExceptionFilter過濾器

來源:互聯網
上載者:User
這篇文章主要為大家詳細介紹了asp.net core MVC 全域過濾器之ExceptionFilter過濾器,具有一定的參考價值,感興趣的小夥伴們可以參考一下

本系類將會講解asp.net core MVC中的內建全域過濾器的使用,將分為以下章節

  asp.net core MVC 過濾器之ExceptionFilter過濾器(一)

  asp.net core MVC 過濾器之ActionFilter過濾器(二)

  asp.net core MVC 過濾器之ResultFilter過濾器(三)

  asp.net core MVC 過濾器之ResourceFilter過濾器(四)

  asp.net core MVC 過濾器之AuthorizationFilter過濾器(五)  

簡介

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

實現一個自訂異常過濾器

自訂一個全域異常過濾器需要實現IExceptionFilter介面


public class HttpGlobalExceptionFilter : IExceptionFilter  {    public void OnException(ExceptionContext context)    {      throw new NotImplementedException();    }  }

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


  /// <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方法如下


 services.AddMvc(options =>      {        options.Filters.Add<HttpGlobalExceptionFilter>();      });

測試

在請求中拋出一個異常

日誌正確捕獲到異常資訊

瀏覽器返回500錯誤,並且返回自訂的錯誤資訊。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.