ASP.NET Core怎么实现全局异常处理 ASP.NET Core全局异常中间件

来源:这里教程网 时间:2026-02-21 17:32:59 作者:

ASP.NET Core 实现全局异常处理,最常用且推荐的方式是使用内置的 异常处理中间件,比如

UseExceptionHandler
UseDeveloperExceptionPage
。它们能捕获未被 try-catch 拦截的异常,并统一返回友好响应,避免堆栈信息暴露给生产环境用户。

配置全局异常处理中间件

Program.cs
(.NET 6+)中,按顺序注册异常处理中间件:

UseDeveloperExceptionPage()
仅用于开发环境,显示详细错误页(含源码、变量、调用栈)
UseExceptionHandler()
用于所有环境,可指定自定义错误处理路径(如
/error
)或内联委托处理异常

示例:

var app = builder.Build();
if (app.Environment.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
else
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}
app.UseHttpsRedirection();
// ... 其他中间件

自定义错误处理页面或 API 响应

若使用

UseExceptionHandler("/Error")
,需确保有对应端点(如 MVC 的
Error
Action 或 Minimal API 路由)来接收并处理异常上下文:

MVC 中可在
Controllers/SharedController.cs
添加
Error
方法,通过
IHttpContextAccessor
HttpContext.Features.Get<iexceptionhandlerfeature>()</iexceptionhandlerfeature>
获取异常详情
API 场景下更推荐用内联委托直接返回 JSON 错误响应,例如:
app.UseExceptionHandler(errorApp =>
{
    errorApp.Run(async context =>
    {
        context.Response.StatusCode = StatusCodes.Status500InternalServerError;
        context.Response.ContentType = "application/json";
        var feature = context.Features.Get<IExceptionHandlerFeature>();
        var ex = feature?.Error;
        var response = new
        {
            error = "An unexpected error occurred.",
            detail = ex?.Message,
            traceId = context.TraceIdentifier
        };
        await context.Response.WriteAsJsonAsync(response);
    });
});

捕获特定异常并差异化响应

如果需要对不同异常类型(如

ValidationException
NotFoundException
)返回不同状态码或消息,可以在自定义异常处理逻辑中做类型判断:

检查
feature.Error is ValidationException vEx
,返回 400 并附带验证失败字段
判断是否为自定义业务异常(如继承自
BusinessException
),提取 ErrorCode 或 UserMessage
注意:中间件捕获的是“未处理异常”,所以 Controller 层已 catch 并 handled 的异常不会到达这里

日志记录与监控集成

全局异常处理是记录错误日志的关键入口:

UseExceptionHandler
委托中注入
ILogger
,记录异常详情和请求上下文(如 URL、Method、User ID)
结合 Serilog、Application Insights 等工具,自动上报异常指标和追踪链路 避免在日志中打印敏感数据(如密码、Token),建议脱敏后再记录

基本上就这些。合理配置

UseExceptionHandler
就能覆盖绝大多数场景,再配合结构化日志和前端友好的错误响应,全局异常处理就稳了。

相关推荐