zoukankan      html  css  js  c++  java
  • ASP.NET Core-几种异常处理中间件

    NuGet包“Microsoft.AspNetCore.Diagnostics”中提供了几个与异常处理相关的中间件。当ASP.NET Core应用在处理请求过程中出现错误时,中间件捕获异常,并将错误信息返回给客户端

    DeveloperExceptionPageMiddleware

    开发者错误页面中间件,给开发人员看的,不对外展示。我们可以在这个页面中看到几乎所有的错误信息,包括异常的类型、消息和堆栈信息等。还显示与当前请求上下文相关的信息,其中包括当前请求URL携带的所有查询字符串、所有请求报头、Cookie的内容和路由信息(终结点和路由参数)。如此详尽的信息无疑会极大地帮助开发人员尽快找出错误的根源。

                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
    

    ExceptionHandlerMiddleware

    生产环境使用,在生产环境下,我们倾向于为用户呈现一个定制的错误页面,这可以通过ExceptionHandlerMiddleware的中间件实现。顾名思义,这个中间件旨在提供一个异常处理器(ExceptionHandler)来处理抛出的异常。实际上,这个所谓的异常处理器就是一个RequestDelegate对象,ExceptionHandlerMiddleware中间件捕捉到抛出的异常后利用它来处理当前的请求。
    如果我们有一个错误页,可以直接指定URL

    app.UseExceptionHandler("/Home/Error");
    

    如果需要输出错误信息,可以使用以下方式

    
                    app.UseExceptionHandler(new ExceptionHandlerOptions()
                    {
                        //ExceptionHandlingPath = "/Home/Error",
                        ExceptionHandler = (ctx) =>
                        {
                            var feature = ctx.Features.Get<IExceptionHandlerFeature>();
                            var exception = feature.Error;
                            ctx.Response.Write(exception.Message);
                            return Task.CompletedTask;
                        }
                    });
    

    StatusCodePagesMiddleware

    针对响应状态码定制错误页面,针对响应状态码对错误页面的定制可以借助一个StatusCodePagesMiddleware类型的中间件来实现,不同状态码显示不同的错误页
    如果我们希望针对不同的错误状态码显示不同的错误页面,那么就需要将具体的请求处理逻辑实现在一个状态码错误处理器中,并最终提供给StatusCodePagesMiddleware中间件。这个所谓的状态码错误处理器体现为一个Func<StatusCodeContext, Task>类型的委托对象,作为输入的StatusCodeContext对象是对HttpContext上下文的封装,它同时承载着其他一些与错误处理相关的选项设置

    public class Program
    {
        private static readonly Random _random = new Random();
        public static void Main()
        {
            Host.CreateDefaultBuilder()
                .ConfigureWebHostDefaults(webBuilder => webBuilder.Configure(app => app
                    .UseStatusCodePages(HandleAsync)
                    .Run(context => Task.Run(() => context.Response.StatusCode = _random.Next(400, 599)))))
                .Build()
                .Run();
    
            static async Task HandleAsync(StatusCodeContext context)
            {
                var response = context.HttpContext.Response;
                if (response.StatusCode < 500)
                {
                    await response.WriteAsync($"Client error ({response.StatusCode})");
                }
                else
                {
                    await response.WriteAsync($"Server error ({response.StatusCode})");
                }
            }
        }
    }
    

    MVC异常过滤器ExceptionFilter

    只能捕获Controller中的异常

    参考:
    https://www.cnblogs.com/artech/p/error-handling-middleware-01.html
    https://www.jianshu.com/p/cab597211136
    https://www.jb51.net/article/153926.htm

  • 相关阅读:
    团队项目冲刺第十天
    gradle文件配置
    idea无Android项目
    php第二次实验报告
    最长回文字串(hdu 3068)
    优先队列实现哈弗曼最小权值
    最小生成树 克鲁斯卡尔(Kruskal)算法求最小生成树
    背包问题------ 分类: ACM 2015-08-03 20:57 1人阅读 评论(0
    Cent Savings (DP) 分类: ACM dp 2015-08-0
    Judging Troubles (multiset查找) 分类: ACM STL
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/14337583.html
Copyright © 2011-2022 走看看