Asp.net 异常捕捉完整方案

先说结论

1.在方法内部已经处理过的异常,是否可以捕捉到?   无法捕捉  处理过的异常就不是异常了

2.在方法内部没有处理过的异常,是否可以捕捉到?   可以捕捉

3.在控制器构造函数中发生的异常,是否可以捕捉到? 可以捕捉

4.在Servcie层发生的异常是否可以捕捉到?          可以捕捉  Service层是Di层的下层,异常的抛出是从下往上抛出;

5.在Filter内部发生的异常是否可以捕捉到?         部分可以,部分不可以

6.在视图中如果发生异常,是否可以捕捉到?         无法捕捉

7.请求的链接错误,异常是否可以捕捉都呢?         无法捕捉

如果只使用这个ExcptionFilter来做异常的处理。其实不够的;

需要使用ExcptionFilter+中间件

ExcptionFilter过滤器

public class CustomAsyncExceptionFilterAttribute : Attribute, IAsyncExceptionFilter
{
    private readonly IModelMetadataProvider _IModelMetadataProvider;
    public CustomAsyncExceptionFilterAttribute( IModelMetadataProvider iModelMetadataProvider )
    {
        _IModelMetadataProvider = iModelMetadataProvider;
    }
    
    /// <summary>
    /// 异步捕捉异常
    /// </summary>
    /// <param name="context"></param>
    /// <returns></returns>
    public Task OnExceptionAsync(ExceptionContext context)
    {

        if ( context.ExceptionHandled == false ) // 表示异常没被处理
        {
            
            // 开始处理异常 返回一个异常提示页面 或者 json格式给用户
            {

                if ( IsAjaxRequest(context.HttpContext.Request) )
                {
                    // 返回json
                    context.Result = new JsonResult(new
                    {
                        code = 500,
                        msg = context.Exception.Message
                    });
                }
                else
                {
                    // 返回页面

                    ViewResult result = new ViewResult { ViewName = "~/Views/Shared/Error.cshtml" };
                    result.ViewData = new ViewDataDictionary(_IModelMetadataProvider, context.ModelState);
                    result.ViewData.Add("Exception", context.Exception);

                    context.Result = result;
                }
            }
            context.ExceptionHandled = true; // 表示异常已经被处理过了
        }
        
        return Task.CompletedTask;
    }

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

中间件配置

#region 异常处理中间件

// 当发生HTTP错误状态码时,重新执行特定的Razor视图页面。
app.UseStatusCodePagesWithReExecute("/Shared/Error.cshtml");

app.UseExceptionHandler(errorApp =>
{
    errorApp.Run(async context =>
    {
        context.Response.StatusCode = 200;
        context.Response.ContentType = "text/html";
        await context.Response.WriteAsync("<html lang=\"en\"><body>\r\n");
        await context.Response.WriteAsync("ERROR!<br><br>\r\n");
        var exceptionHandlerPathFeature =
            context.Features.Get<IExceptionHandlerPathFeature>();
        Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
        Console.WriteLine($"{exceptionHandlerPathFeature?.Error.Message}");
        Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");

        if (exceptionHandlerPathFeature?.Error is FileNotFoundException)
        {
            await context.Response.WriteAsync("File error thrown!<br><br>\r\n");
        }
        await context.Response.WriteAsync("<a href=\"/\">Home</a><br>\r\n");
        await context.Response.WriteAsync("</body></html>\r\n");
        await context.Response.WriteAsync(new string(' ', 512)); // IE padding
    });

});

#endregion

  • 20
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值