Пробросить ошибку из в [FromBody] в catch

Рейтинг: 1Ответов: 1Опубликовано: 04.02.2023

Всем привет. Есть webApi контроллер.

Если передаю в контроллер тело с number < 1 в контроллере вызывается ошибка и запрос отменяется. Можно ли как то пробросить его в catch, где у меня происходит кастомная обработка ошибок с выбором языка ответа и т.д.?

Контроллер

    [HttpPost]
    [Route("[action]")]
    public async Task<JsonResult> Add([FromBody] Settings settings)
    {
        try
        {
            await Task.Delay(1);

            return Json(true, "Ok! Status: 200");
        }
        catch (AppException ex)
        {
            return Json(false, ex);
        }
    }

и модель

public class Settings
{
   private int _number;
    
    public int Number
    {
        get => _number;
        set
        {
            if (value < 1)
                throw new Exception("Нельзя выбрать значение < 1");
            _number = value;
        }
    }
}

Ответы

▲ 0

Удалось решить проблему.

в собственном классе ошибки переопределил сообщение. Сейчас можно обойтись без try catch. Ошибка перехвачивается глобально

public class BelowOneException : AppException
{
    public override string Message { get; }

    public BelowOneException()
    {
        //Это можно не смотреть. Локализация сообщения ошибки
        Message = new Localization.Localization()[this];
    }
}

Далее сделал собственный мидлвейр

public class ExceptionHandlerMiddleware    
{    
    private readonly RequestDelegate _next;    
    
    public ExceptionHandlerMiddleware(RequestDelegate next)    
    {    
        _next = next;    
    }    
    
    public async Task Invoke(HttpContext context)    
    {    
        try    
        {    
            await _next.Invoke(context);    
        }    
        catch (AppException ex)    
        {    
            await HandleExceptionMessageAsync(context, ex).ConfigureAwait(false);   
        }    
    }
    private static Task HandleExceptionMessageAsync(HttpContext context, AppException exception)  
    {  
        context.Response.ContentType = "application/json";  
        int statusCode = (int)HttpStatusCode.InternalServerError;  
        var result = JsonConvert.SerializeObject(new  
        {  
            Status = statusCode,  
            Message = exception.Message  
        });
        return context.Response.WriteAsync(result);
    }
}  

public static class ExceptionHandlerMiddlewareExtensions  
{  
    public static void UseExceptionHandlerMiddleware(this IApplicationBuilder app)  
    {  
        app.UseMiddleware<ExceptionHandlerMiddleware>();  
    }  
}    

И в Program.cs его добавил

app.UseExceptionHandlerMiddleware();