C# веб-API, как обрабатывать исключения и возвращать соответствующий код состояния - PullRequest
1 голос
/ 11 февраля 2020

Я создаю. net core web api, который может выдать исключение, в этом случае он не может найти человека по идентификатору. Если человек не найден, я выдал пользовательское исключение, например NotFoundException.

Есть ли общее / глобальное место, где я могу перехватить это исключение и затем вернуть код состояния 404. Вместо того, чтобы писать собственный код в каждом контроллере для обработки всех возможных исключений. Я думал, может быть, просто класс ExceptionHelper, может быть, но мне было интересно, есть ли лучший способ. Как в идеале я хочу обработать все исключения в одном месте и вернуть разные коды состояния на основе исключений?

1 Ответ

1 голос
/ 11 февраля 2020

вы можете справиться с этим в Configure методе вашего Startup.cs. Примерно так:

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.");
            }

        });
    });
    ...
}

В ваших контроллерах вы поднимаете свои исключения

...