You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core自定义IExceptionHandler无法捕获异常问题

问题诊断与解决

核心原因:缺少异常处理中间件注册

你仅在服务容器中注册了GlobalExceptionHandler,但未在请求管道中添加UseExceptionHandler中间件,ASP.NET Core不会自动启用自定义异常处理器,导致默认异常处理逻辑依然生效。

修复步骤

  1. 在Program.cs中添加异常处理中间件
    在var app = builder.Build();之后的管道配置阶段,添加UseExceptionHandler,注意中间件顺序:它需要放在UseAuthorization、UseEndpoints等业务中间件之前,确保能捕获后续管道中的异常。

    修改后的Program.cs管道示例:

    var app = builder.Build();
    
    // 优先添加异常处理中间件
    app.UseExceptionHandler();
    
    if (app.Environment.IsDevelopment())
    {
        app.UseSwagger();
        app.UseSwaggerUI();
    }
    
    app.UseHttpsRedirection();
    app.UseAuthorization();
    app.MapControllers();
    
    app.Run();
    
  2. 优化异常响应处理(推荐)
    你的TryHandleAsync方法缺少响应头设置,可能导致客户端无法正确解析响应,补充状态码与Content-Type,并使用规范的异步写入方式:

    public async ValueTask<bool> TryHandleAsync(HttpContext context, Exception ex, CancellationToken ct)
    {
        logger.LogError(ex, "Controller error occured");
    
        context.Response.StatusCode = StatusCodes.Status500InternalServerError;
        context.Response.ContentType = "application/json";
    
        ErrorResponse errors = new()
        {
            Errors = [new ApiError(-1, "Internal Server Error")]
        };
        string jsonRes = JsonSerializer.Serialize(errors);
    
        await context.Response.WriteAsync(jsonRes, ct);
    
        return ValueTask.FromResult(true);
    }
    
  3. 验证中间件顺序
    确保UseExceptionHandler是管道中较早注册的中间件,因为中间件按顺序执行,只有后续中间件抛出的异常才能被它捕获。若放在MapControllers之后,将无法捕获控制器内的异常。

其他排查点

  • 若开发环境中注册了UseDeveloperExceptionPage,它会优先处理异常导致自定义处理器不触发,可注释该中间件或调整顺序让UseExceptionHandler前置。
  • 检查GlobalExceptionHandler的构造函数注入是否正常(如ILogger是否成功注入),注入失败会导致处理器无法实例化(通常启动时会报错)。

内容的提问来源于stack exchange,提问作者iKingNinja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 05:58:20