.net ExceptionFilter异常处理

108 阅读1分钟

controller 手动抛出异常

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using WebApplication3.Utility.Filter;

namespace WebApplication3.Controllers
{

    public class ThirdController : Controller
    {

        [TypeFilter(typeof(CustomExceptionFilter))]
        public IActionResult Index3()
        {
            throw new Exception("故意抛的");
        }
    }
}

创建异常处理类 CustomExceptionFilter

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using NuGet.Protocol.Plugins;

namespace WebApplication3.Utility.Filter
{
    public class CustomExceptionFilter : Attribute, IExceptionFilter/*, IAsyncExceptionFilter*/
    {

        private readonly IModelMetadataProvider model;

        public CustomExceptionFilter(IModelMetadataProvider model) {

            this.model = model;
        
        }
        /// <summary>
        /// 当有异常发生时,就会触发到这里
        /// </summary>
        /// <param name="context"></param>
        /// <exception cref="NotImplementedException"></exception>
        public void OnException(ExceptionContext context)
        {
            Console.WriteLine("同步异常处理");
            if (context.ExceptionHandled == false)
            {
                //在这里处理异常
                if (IsAjaxRequest(context.HttpContext.Request))
                {
                    // 返回json
                    context.Result = new JsonResult(new
                    {
                        Success = false,
                        Message = context.Exception.Message,
                    });

                }
                else
                {
                    // 返回页面
                    ViewResult result = new ViewResult { ViewName = "~/Views/Shared/Error.cshtml" };
                    result.ViewData = new ViewDataDictionary(model, context.ModelState);
                    result.ViewData.Add("Exception", context.Exception);
                    // 断路器,只要对Result就不继续往后了
                    context.Result = result;

                }

                // 表示当前异常被处理
                context.ExceptionHandled = true;
            }

            
        }


        private bool IsAjaxRequest(HttpRequest request)
        {
            string header = request.Headers["X-Requested-With"];
            return "XMLHttpRequest".Equals(header);
        }

        /// <summary>
        /// 当有异常发生时,就会触发到这里,异常处理默认选择异步
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
     /*   public Task OnExceptionAsync(ExceptionContext context)
        {
            Console.WriteLine("异步异常处理");

            throw new NotImplementedException();
        }*/
    }
}

异常页面 Error.cshtml

@model ErrorViewModel
@{
    ViewData["Title"] = "Error";
    Exception exception = ViewData["Exception"] as Exception;
}

<h1 class="text-danger">Error.</h1>
@if (exception != null)
{
    <h3 class="text-danger">@exception.Message</h3>
}

页面展示

image.png