C#web api,如何处理异常并返回适当的状态代码

C#web api,如何处理异常并返回适当的状态代码,c#,exception,.net-core,webapi,C#,Exception,.net Core,Webapi,我正在创建一个.net core web api,它可能会引发异常,在这种情况下,它无法通过id找到一个人。如果找不到此人,我会引发一个自定义异常,例如NotFoundException 是否有一个公共/全局位置可以拦截此异常,然后返回404状态代码。 而不是在每个控制器中编写自定义代码来处理所有不同的可能异常。我想也许只是一个例外的助手类,但想知道是否有更好的方法。理想情况下,我希望在一个位置处理所有异常,并根据异常返回不同的状态代码?您可以在Startup.cs的Configure方法中处理

我正在创建一个.net core web api,它可能会引发异常,在这种情况下,它无法通过id找到一个人。如果找不到此人,我会引发一个自定义异常,例如NotFoundException

是否有一个公共/全局位置可以拦截此异常,然后返回404状态代码。
而不是在每个控制器中编写自定义代码来处理所有不同的可能异常。我想也许只是一个例外的助手类,但想知道是否有更好的方法。理想情况下,我希望在一个位置处理所有异常,并根据异常返回不同的状态代码?

您可以在
Startup.cs的
Configure
方法中处理此问题。如下所示:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    app.UseExceptionHandler(appBuilder =>
    {
        appBuilder.Run(async context =>
        {
            var exceptionHandlerFeature = context.Features.Get<IExceptionHandlerFeature>();
            if (exceptionHandlerFeature != null)
            {
                var exception = exceptionHandlerFeature.Error;
                if(exception == YourNotFoundException)
                {
                    context.Response.StatusCode = 404;
                    await context.Response.WriteAsync("Could not find resource");
                }
                //you can also have global logging here eg:
                //var logger = loggerFactory.CreateLogger("Global exception logger");
                //logger.LogError(500, exception, exception.Message);
            }
            else
            {
                context.Response.StatusCode = 500;
                await context.Response.WriteAsync("an unexpected fault happened. Try again later.");
            }

        });
    });
    ...
}
public void配置(IApplicationBuilder应用程序、IHostingEnvironment环境、iLogger工厂)
{
app.UseExceptionHandler(appBuilder=>
{
appBuilder.Run(异步上下文=>
{
var exceptionHandlerFeature=context.Features.Get();
if(exceptionHandlerFeature!=null)
{
var exception=exceptionHandlerFeature.Error;
if(exception==YourNotFoundException)
{
context.Response.StatusCode=404;
wait context.Response.WriteAsync(“找不到资源”);
}
//您也可以在此处进行全局日志记录,例如:
//var logger=loggerFactory.CreateLogger(“全局异常记录器”);
//logger.LogError(500,异常,异常消息);
}
其他的
{
context.Response.StatusCode=500;
wait context.Response.WriteAsync(“发生意外错误,请稍后再试”);
}
});
});
...
}

然后在控制器中引发异常

您可以在
Startup.cs的
Configure
方法中处理此问题。如下所示:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    app.UseExceptionHandler(appBuilder =>
    {
        appBuilder.Run(async context =>
        {
            var exceptionHandlerFeature = context.Features.Get<IExceptionHandlerFeature>();
            if (exceptionHandlerFeature != null)
            {
                var exception = exceptionHandlerFeature.Error;
                if(exception == YourNotFoundException)
                {
                    context.Response.StatusCode = 404;
                    await context.Response.WriteAsync("Could not find resource");
                }
                //you can also have global logging here eg:
                //var logger = loggerFactory.CreateLogger("Global exception logger");
                //logger.LogError(500, exception, exception.Message);
            }
            else
            {
                context.Response.StatusCode = 500;
                await context.Response.WriteAsync("an unexpected fault happened. Try again later.");
            }

        });
    });
    ...
}
public void配置(IApplicationBuilder应用程序、IHostingEnvironment环境、iLogger工厂)
{
app.UseExceptionHandler(appBuilder=>
{
appBuilder.Run(异步上下文=>
{
var exceptionHandlerFeature=context.Features.Get();
if(exceptionHandlerFeature!=null)
{
var exception=exceptionHandlerFeature.Error;
if(exception==YourNotFoundException)
{
context.Response.StatusCode=404;
wait context.Response.WriteAsync(“找不到资源”);
}
//您也可以在此处进行全局日志记录,例如:
//var logger=loggerFactory.CreateLogger(“全局异常记录器”);
//logger.LogError(500,异常,异常消息);
}
其他的
{
context.Response.StatusCode=500;
wait context.Response.WriteAsync(“发生意外错误,请稍后再试”);
}
});
});
...
}

然后在控制器中引发异常

好,尝试了这个,可以看到在我启动web应用程序时注册的UseExceptionHandler,但当我从业务层抛出异常时,它不会进入此代码,而是返回500状态代码。您是否在开始注册中间件配置方法?状态代码是通用的还是在exceptionHandler中设置的?啊,谢谢,是的,代码上面定义了这一点,它似乎停止了应用程序的工作。使用developerExceptionPage(),所以删除它及其工作,许多thanks我通常会通过
if(env.IsDevelopment())来处理它{app.UseDeveloperExceptionPage();}其他{//我的答案中的代码片段}
。好的,所以尝试了这个方法,在启动web应用程序时可以看到正在注册的UseExceptionHandler,但当我从业务层抛出异常时,它不会进入此代码,而是返回500状态代码。您是在配置方法的开头注册中间件吗?状态代码是通用的还是t你在exceptionHandler中设置了一个吗?啊,谢谢,是的,代码在上面定义了这个,它似乎停止了应用程序的工作。使用developerCeptionPage(),所以删除它和它的工作,许多感谢我通常会通过
if(env.IsDevelopment()){app.usedeveloperCeptionPage();}来处理这个问题else{//我的答案中的代码片段}