在 .NET Core 中,异常处理中间件的配置需要根据环境(开发/生产)选择不同的策略,主要涉及 UseExceptionHandler
和 UseDeveloperExceptionPage
两个关键方法。以下是它们的区别和配置方法:
一、核心区别
特性 | UseDeveloperExceptionPage (开发环境异常页) | UseExceptionHandler (生产环境异常处理) |
---|---|---|
适用环境 | 仅开发环境 (Development ) | 生产环境 (Production , Staging 等) |
信息展示 | 显示详细错误(堆栈、请求头、路由、Query 参数等) | 隐藏敏感信息,展示友好错误页或执行自定义逻辑 |
安全性 | 不安全,暴露内部细节 | 安全,避免信息泄漏 |
用途 | 调试时快速定位问题 | 用户友好的错误提示或记录异常 |
二、配置方法 (以 .NET 6+ 的 Program.cs
为例)
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
// 配置异常处理中间件(注意顺序!)
if (app.Environment.IsDevelopment())
{
// 开发环境:显示详细错误页
app.UseDeveloperExceptionPage();
}
else
{
// 生产环境:全局异常捕获 + 友好错误页
app.UseExceptionHandler("/error");
// 可选:启用静态文件中间件(若错误页需要 CSS/图片)
app.UseStaticFiles();
}
// 其他中间件(路由、终结点等)
app.UseRouting();
app.MapGet("/error", () => "抱歉,发生了一个意外错误!");
app.MapGet("/", () => { throw new Exception("测试异常"); });
app.Run();
三、关键细节说明
-
中间件顺序
异常处理中间件应最早注册,确保它能捕获后续中间件(如路由、身份认证等)的异常。
-
自定义错误处理逻辑
UseExceptionHandler
支持更灵活的配置,例如重定向到指定路径或执行自定义处理:
app.UseExceptionHandler(errorApp =>
{
errorApp.Run(async context =>
{
var exceptionHandler = context.Features.Get<IExceptionHandlerPathFeature>();
// 记录异常(如使用 ILogger)
logger.LogError(exceptionHandler.Error, "全局异常");
// 返回 JSON 或定制 HTML
context.Response.ContentType = "application/json";
await context.Response.WriteAsync(JsonSerializer.Serialize(new { error = "请求失败" }));
});
});
-
环境变量设置
确保环境变量
ASPNETCORE_ENVIRONMENT
正确设置:- 开发环境:
Development
- 生产环境:
Production
- 开发环境:
-
补充中间件
生产环境可配合
UseStatusCodePages
处理 404 等状态码:
app.UseStatusCodePagesWithRedirects("/status-code/{0}");
四、常见问题
-
Q:为什么开发环境不显示详细错误?
A:检查环境变量是否设置为
Development
,或代码中是否错误地强制覆盖了环境配置。 -
Q:如何记录生产环境的异常?
A:在
UseExceptionHandler
的自定义处理中注入ILogger
,或使用全局异常过滤器(如IExceptionFilter
)。 -
Q:中间件顺序错误导致异常未被捕获?
A:确保异常处理中间件是管道中的第一个中间件。
通过合理配置这两个中间件,既能保障开发效率,又能提升生产环境的安全性。