.Net Общая обработка исключений

У меня есть несколько контроллеров .Net, которые выглядят так:

[HttpGet("{id}")]
public async Task<ActionResult<Int32>> GetById(Int32 id)
{
    id = FormatId(id);
    return lookupId(id);
}

Предположим, у меня есть десятки этих конечных точек на нескольких контроллерах, и некоторые из них требуют, чтобы идентификатор был отформатирован определенным образом, например целое число, дополненное до 5 цифр, поэтому FormatId дополняет его для меня, и если он больше 5 цифр, он выдает исключение BadHttpRequestException. .

Теперь вместо того, чтобы засорять все конечные точки, связанные с идентификатором,:

try/catch { return BadRequest() }

Могу ли я каким-либо образом прикрепить общий обработчик исключений к любым/всем конечным точкам/контроллерам?

По сути, я просто хочу сделать что-то вроде:

Controller.OnException(Exception e)
{
    if (e.Type == BadHttpRequestException) // Ignore invalid C# syntax, just pseudocode
    {
        return BadRequest(e.Message);
    }
}

Я предполагаю, что это будет поддерживаемый способ, или могу ли я иметь доступ к уровню над конечной точкой контроллера, чтобы я мог сам его поймать и сделать что-то вроде:

public MyWrapperEndpoint(T endpoint)
{
    try {
        endpoint(); // call whatever endpoint was requested (GetById)
    } catch (BadHttpRequestException e) {
        return BadRequest(e.Message);  // Return the common exception message
    }
}

По сути, мой вопрос сводится к тому, что если мои нижние уровни выдают исключение BadHttpRequestException (или любое другое исключение, которое, как я знаю, я явно выбрасываю), как я могу легко заставить все конечные точки моего контроллера перехватывать это исключение и возвращать объект BadRequest?

Вместо 400 Bad Request я бы поместил пользовательское ограничение маршрута в заполнитель id и позволил ему возвращать 404 Not Found, поскольку он никогда не будет/не должен находить что-то, что не соответствует формату.

madreflection 10.05.2024 23:05

Это называется глобальной обработкой исключений путем реализации промежуточного программного обеспечения в .Net Использование промежуточного программного обеспечения для перехвата исключений в Asp.Net Core Обработка исключений веб-API ASP.NET Core

balron 11.05.2024 03:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что промежуточное программное обеспечение, перехватывающее исключения обработки, должно соответствовать вашим потребностям:

public class ExceptionHandlingMiddleware
{
    private readonly RequestDelegate _next;

    public ExceptionHandlingMiddleware(
        RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext httpContext)
    {
        try
        {
            await _next(httpContext);
        }
        catch (BadHttpRequestException ex)
        {
            httpContext.Response.StatusCode = StatusCodes.Status400BadRequest;
            await httpContext.Response.WriteAsJsonAsync(new
            {
                message = ex.Message,
            });
        }
    }
}

А затем вы добавили его в качестве промежуточного программного обеспечения в свой стартап или программу в зависимости от того, где вы создаете свое приложение:

builder.UseMiddleware<ExceptionHandlingMiddleware>();

Промежуточное программное обеспечение позволяет контроллеру вызывать логику сервиса, логика сервиса выдает исключение, и если вы не перехватите исключение на уровне контроллера, промежуточное программное обеспечение перехватит его. Плюс этого подхода в том, что вы по-прежнему можете перехватывать исключения в своих контроллерах и возвращать разные коды состояния или поведения. Промежуточное программное обеспечение является спасателем всех контроллеров конечных точек без попыток и перехвата. Обратите внимание, что я добавил только ваше исключение BadHttpRequestException, но вы можете продолжить перехват всех типов и общего исключения.

Другие вопросы по теме