.net ExceptionFilter异常处理

该文章展示了如何在ASP.NETCoreMVC应用中创建一个自定义异常过滤器(CustomExceptionFilter),用于捕获并处理控制器中手动抛出的异常。当异常发生时,过滤器会判断请求是否为Ajax请求,并分别返回JSON或重定向到错误页面(Error.cshtml)。此外,还提供了一个同步的异常处理方法。
摘要由CSDN通过智能技术生成

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; }

Error.

@if (exception != null) {

@exception.Message

}

```

页面展示

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值