作用:当程序运行时出现故障,但没有捕获的异常时,会进入异常过滤器,进行统一的处理。
下面我们先来介绍下异常过滤器,.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