• 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

  • 相关阅读:
    UNIX网络编程——TCP/IP简介
    UNIX环境高级编程——TCP/IP网络编程
    UNIX环境高级编程——网络编程常用函数及结构
    UNIX环境高级编程——网络基础概念
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/fei686868/p/10470485.html
Copyright © 2020-2023  润新知