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