zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    汽车驾驶盲区 无论新手老手都要看看
    看看大货车到底有多少盲区,肯定用得到!救命的!
    大货车的盲区很大的,所以在大货车周围 超车 并线的时候 最好鸣喇叭提示一下...
    换挡时机
    新手眼中的葵花宝典,手把手教你成为一名老司机!
    后视镜什么时候看?老司机也不一定知道
    【调查】开车时,你多长时间看一下后视镜?(安全驾驶)
    究竟什么时候该看哪个后视镜?老司机用经验告诉你答案
    java selenium (五) 元素定位大全
    java selenium (八) Selenium IDE 用法
  • 原文地址:https://www.cnblogs.com/fei686868/p/10470485.html
Copyright © 2011-2022 走看看