ASP.NET Core 异常处理

此文只是从中摘录整理下自己感兴趣的部分,以便备忘和方便查找回顾,详见:


由于 ASP.NET Core 是一个同时处理多个请求的 web 应用框架,所以在处理某个请求过程中抛出的异常并不会导致整个应用的终止。

NuGet 包 Microsoft.AspNetCore.Diagnostics 中提供了几个与异常处理相关的中间件。当 ASP.NET Core 应用在处理请求过程中出现错误时,我们可以利用他们将原生的或者定制的错误信息作为响应内容发送给客户端。

ASP.NET Core 应用在进行请求处理时出现的任何错误都会被写入日志,所以可以通过注册相应的 ILoggerProvider 对象来获取写入的错误日志信息。

显示开发者异常页面

该页面只是在开发环境给开发人员看的,会将异常详细信息和基于当前请求的上下文直接现在在错误页面中,这位开发人员的纠错诊诊断提供了极大的便利。开发者异常页面的呈现是利用一个名为 DeveloperExceptionPageMiddleware 的中间件完成的,正确使用方式如下:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }
}

呈现一个定制的错误页面

但是在生产环境下,我们倾向于为最终的用户呈现一个定制的错误页面,这可以通过注册另一个名为 ExceptionHandlerMiddleware 的中间件来实现。

即,先定义一个异常处理器(ExceptionHandlerMiddle)来处理抛出的异常,实际上就是一个 RequestDelegate 对象。

        //Startup.cs
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {  
        	var options = new ExceptionHandlerOptions { ExceptionHandler = HandleAsync };
            app.UseExceptionHandler(options);
            
            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=TestException}/{id?}");
            });

            Task HandleAsync(HttpContext context)
                => context.Response.WriteAsync("Unhandled exception occurred!");
        }
        //HomeController.cs
		public IActionResult TestException()
        {
            throw new Exception("故意炮哥异常看看。");
        }	

如果应用已经设置了一个错误页面,并且这个错误页面有一个固定的路径,那么我们在进行异常处理的时候,就没有必要提供这个RequestDelegate对象,只需要重定向到错误页面指向的路径即可,如:

app.UseExceptionHandler("/home/error");


更新于:2023.5.20

posted @ 2023-05-20 12:03  AI大胜  阅读(151)  评论(0)    收藏  举报