在.netcore程序中添加全局的异常过滤器

作用:当程序运行时出现故障,但没有捕获的异常时,会进入异常过滤器,进行统一的处理。

  下面我们先来介绍下异常过滤器,.net core 过滤器需要实现IExceptionFilter接口

//IExceptionFilter有一个未实现的方法
 void OnException(ExceptionContext context);
   
// 摘要:

//异常筛选器的上下文,即Microsoft.AspNetCore.Mvc.filters.IExceptionFilter

//以及Microsoft.AspNetCore.Mvc.Filters.IAsyncExceptionFilter实现。 
    public class ExceptionContext : FilterContext
    {
        //
        // 摘要:
        //    获取或设置在执行操作时捕获的System.Exception。
        public virtual Exception Exception
        {
            get
            {
                throw null;
            }
            set
            {
            }
        }
        // 摘要:
        //     获取或设置的System.Runtime.ExceptionServices.ExceptionDispatchInfo

//Microsoft.AspNetCore.Mvc.Filters.ExceptionContext.Exception,如果此信息

//被抓获。
        public virtual ExceptionDispatchInfo ExceptionDispatchInfo
        {
            get
            {
                throw null;
            }
            set
            {
            }
        }
        // 摘要:
        //   获取或设置Microsoft.AspNetCore.Mvc.Filters.ExceptionContext.Exception
//已经处理好了。
        public virtual bool ExceptionHandled
        {
            [CompilerGenerated]
            get
            {
                throw null;
            }
            [CompilerGenerated]
            set
            {
            }
        }
        //
        // 摘要:
        //     获取或设置Microsoft.AspNetCore.Mvc.IActionResult。
        public virtual IActionResult Result
        {
            [CompilerGenerated]
            get
            {
                throw null;
            }
            [CompilerGenerated]
            set
            {
            }
        } 
//实例化新的Microsoft.AspNetCore.Mvc.Filters.ExceptionContext实例。
// 参数:
//操作上下文:
//Microsoft.AspNetCore.Mvc.ActionContext。
//
//过滤器:

//所有适用的Microsoft.AspNetCore.Mvc.Filters.IFilterMetadata实现。 
        public ExceptionContext(ActionContext actionContext, IList<IFilterMetadata> filters)
            : base(null, null)
        {
        }
    }

下面代码通过继承IExceptionFilter实现全局异常过滤器

/// <summary>
    /// 全局异常过滤器
    /// </summary>
    public class GlobalExceptionFilter : IExceptionFilter, IAsyncExceptionFilter
    {
        public void OnException(ExceptionContext context)
        {
//捕获到程序未处理的异常,通常是用文档记录下来
            LogHelper.Error(context.Exception);
    #region 此代码块中代码可以修改为自己的代码
            if (context.HttpContext.Request.IsAjaxRequest())
            {
                TData obj = new TData();
                obj.Message = context.Exception.GetOriginalException().Message;
                if (string.IsNullOrEmpty(obj.Message))
                {
                    obj.Message = "抱歉,系统错误,请联系管理员!";
                }
                context.Result = new JsonResult(obj);
                context.ExceptionHandled = true;
            }
            else
            {
                string errorMessage = context.Exception.GetOriginalException().Message;
                context.Result = new RedirectResult("~/Home/Error?message=" + HttpUtility.UrlEncode(errorMessage));
                context.ExceptionHandled = true;
            }
#endregion
        }

        public Task OnExceptionAsync(ExceptionContext context)
        {
            OnException(context);
            return Task.CompletedTask;
        }
    }
View Code

写好实现类后需要在.net core中服务管道中添加

找到Startup.cs文件,修改ConfigureServices方法如下

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

 

posted @ 2021-07-19 22:29  袁浩178  阅读(293)  评论(0编辑  收藏  举报