好友化异常处理


  很多时候,我们抛给前端的异常信息是非常不好友的,从而导致客户的反感与不满。如果在发生异常时,前端仅仅接收到类似 “系统出现了异常,请联系系统管理员。” 之类的提示就不一样了。

  Fireasy MVC 里的友好化处理是通过 ActionFilter 实现的。

  在 Asp.Net MVC 里,你需要往 FilterConfig 类里添加 HandleErrorAttribute 过滤器。如下所示:

namespace demo
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new AuthorizeAttribute());
            filters.Add(new Fireasy.Web.Mvc.HandleErrorAttribute());
        }
    }
}

  而在 Asp.Net Core MVC 中,你需要在 Startup.ConfigureServices 方法里使用 ConfigureFireasyMvc 方法,由 UseErrorHandleFilter 来切换启用或禁用:

namespace demo
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddFireasy(Configuration).AddIoc();
#if NETCOREAPP3_1
            services.AddControllersWithViews()
                .ConfigureFireasyMvc(options =>
                {
                    options.UseErrorHandleFilter = true; //默认是开启的
                });
#else
            services.AddMvc()
                .ConfigureFireasyMvc(options =>
                {
                    options.UseErrorHandleFilter = true; //默认是开启的
                });
#endif
            //或是直接采用以下的方法添加过滤器
            services.Configure<MvcOptions>(s =>
                {
                    s.Filters.Add(new Fireasy.Web.Mvc.HandleErrorAttribute());
                });
        }
    }
}

  在适当的地方抛出 ClientNotificationException 异常类返回,前端将接收一个 Result 结果的对象,msg 即为异常的 Message。如果是非 ClientNotificationException 类型的异常,则会使用 日志组件 记录详细的异常,并返回好友的 Result 到前端。

  对于返回数组或列表的 Action,如果抛出 Result 则会影响到前端的解析,因此可以使用 EmptyArrayResultAttribute 进行标记,以便在发生异常时,返回一个空数组。如下所示:

public class HomeController : Controller
{
    [EmptyArrayResult(true)] //返回空数组
    //[EmptyArrayResult("暂未实现")] //返回 Result 结构,显示信息 暂未实现
    public IActionResult GetList()
    {
        throw new NotImplementedException();
    }
}