gpt4 book ai didi

c# - 如何在 .NET Core 中捕获异常并使用状态代码进行响应

转载 作者:行者123 更新时间:2023-11-30 12:20:30 25 4
gpt4 key购买 nike

我正在运行一个 .Net Core Web API 项目。我有一个启动文件(如下)。在 Startup.ConfigureServices(...) 方法中,我添加了一个创建 IFoo 实例的工厂方法。我想捕获 IFooFactory 抛出的任何异常并返回带有状态代码的更好的错误消息。目前我收到 500 错误消息异常。谁能帮忙?

500 Error Message

public interface IFooFactory
{
IFoo Create();
}

public class FooFactory : IFooFactory
{
IFoo Create()
{
throw new Exception("Catch Me!");
}
}

public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IFooFactory,FooFactory>();
services.AddScoped(serviceProvider => {
IFooFactory fooFactory = serviceProvider.GetService<IFooFactory>();
return fooFactory.Create(); // <== Throws Exception
});
}
}

最佳答案

因此,当我以两种不同的方式阅读问题时,我发布了两个不同的答案 - 大量删除/取消删除/编辑 - 不确定哪一个真正回答了你的问题:

要找出应用程序启动时出现的问题并且根本无法运行,请尝试以下操作:

Startup中使用开发者异常页面:

public void Configure(IApplicationBuilder app, IHostingEnvironment env,
ILoggerFactory loggerFactory)
{
app.UseDeveloperExceptionPage();
}

Program 类中:

public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.UseApplicationInsights()
.CaptureStartupErrors(true) // useful for debugging
.UseSetting("detailedErrors", "true") // what it says on the tin
.Build();

host.Run();
}

如果你想在 api 正常工作时处理偶尔的异常,那么你可以使用一些中间件:

public class ExceptionsMiddleware
{
private readonly RequestDelegate _next;

/// <summary>
/// Handles exceptions
/// </summary>
/// <param name="next">The next piece of middleware after this one</param>
public ExceptionsMiddleware(RequestDelegate next)
{
_next = next;
}

/// <summary>
/// The method to run in the piepline
/// </summary>
/// <param name="context">The current context</param>
/// <returns>As task which is running the action</returns>
public async Task Invoke(HttpContext context)
{
try
{
await _next.Invoke(context);
}
catch(Exception ex)
{
// Apply some logic based on the exception
// Maybe log it as well - you can use DI in
// the constructor to inject a logging service

context.Response.StatusCode = //Your choice of code
await context.Response.WriteAsync("Your message");
}
}
}

这里有一个“问题”——如果响应 header 已经发送,您就无法编写状态代码。

使用 Configure 方法在 Startup 类中配置中间件:

public void Configure(IApplicationBuilder app, IHostingEnvironment env,
ILoggerFactory loggerFactory)
{
app.UseMiddleware<ExceptionsMiddleware>();
}

关于c# - 如何在 .NET Core 中捕获异常并使用状态代码进行响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51536300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com