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


簡介

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

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

自定義一個異常過濾器需要實現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錯誤,並且返回自定義的錯誤信息。

參考博文:https://www.cnblogs.com/huanent/p/7420039.html


免責聲明!

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



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