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

.NET 6 迁移至最小API后CaptureStartupErrors功能失效咨询

.NET 6 最小API中CaptureStartupErrors功能生效的正确姿势

你遇到的问题核心是CaptureStartupErrors仅作用于WebHost启动流程内的异常,而非Program.cs Main方法中直接执行的代码异常。以下是具体的解决要点:

1. 确保完整配置CaptureStartupErrors和DetailedErrors

仅设置CaptureStartupErrors(true)不够,还需开启详细错误输出,否则捕获到异常后也无法直观看到信息:

var builder = WebApplication.CreateBuilder(args);

// 开启启动错误捕获
builder.WebHost.CaptureStartupErrors(true);
// 开启详细错误,用于展示捕获到的异常详情
builder.WebHost.UseSetting(WebHostDefaults.DetailedErrorsKey, "true");

2. 区分异常发生的阶段

CaptureStartupErrors只对WebHost启动阶段的异常生效,这个阶段包括:

  • 服务注册时的工厂方法(比如依赖注入中服务实例化的委托逻辑)
  • 中间件的配置与初始化
  • builder.Build()完成后到app.Run()之间的启动逻辑

如果是在builder.Build()之前,Main方法中直接执行的代码抛出异常(比如硬编码的逻辑错误、配置文件读取失败的同步代码),WebHost还未启动,CaptureStartupErrors无法捕获,程序会直接退出。这类场景需要你手动添加try-catch处理。

3. 正确的代码示例

var builder = WebApplication.CreateBuilder(args);

// 配置捕获启动错误和详细错误
builder.WebHost.CaptureStartupErrors(true);
builder.WebHost.UseSetting(WebHostDefaults.DetailedErrorsKey, "true");

// 服务注册:这里的工厂方法异常会被CaptureStartupErrors捕获
builder.Services.AddScoped<IMyService>(sp =>
{
    // 模拟启动时的异常
    throw new InvalidOperationException("服务初始化失败");
    return new MyService();
});

var app = builder.Build();

// 中间件配置:这里的异常会被捕获
app.UseMiddleware<FaultyMiddleware>();

app.MapGet("/", () => "Hello World!");

app.Run();

4. 验证捕获效果

当启动阶段发生异常时,程序不会直接退出,而是会返回包含详细异常信息的500响应(HTTP请求场景),同时控制台也会输出异常日志。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:15:35