Пробросить ошибку из в [FromBody] в catch
Всем привет. Есть 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;
}
}
}
Ответы (1 шт):
Автор решения: Apple One
→ Ссылка
Удалось решить проблему.
в собственном классе ошибки переопределил сообщение. Сейчас можно обойтись без 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();