zoukankan      html  css  js  c++  java
  • 在.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
  • 相关阅读:
    java中math类
    java中的值传递和引用传递(转)
    eclipse 字体和配色修改
    JAR WAR EAR包的区别
    java中基本类型
    tomcat 7.0 配置详解
    或许你需要一些可操作性更强的实践
    Assembly.CreateInstance()与Activator.CreateInstanc
    OOD沉思录2 类和对象的关系包含关系
    C#的插件开发
  • 原文地址:https://www.cnblogs.com/topsyuan/p/15032621.html
Copyright © 2011-2022 走看看