From 6f05877ac98d9aba0fa7d1acddc965287c189521 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9=20=D0=A1=D1=82?= =?UTF-8?q?=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Wed, 28 Jun 2023 16:18:29 +0500 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BA=D0=BB=D1=8E=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Сделал небольшую доработку по исключениям. 1. Создал новое исключение, которое позволяет указывать сразу несколько невалидных параметров. 2. Поправил middleware, сделал обобщённый класс, который преобразует исключение. --- .../Exceptions/ArgumentInvalidException.cs | 6 ++- .../Exceptions/ArgumentsInvalidException.cs | 47 +++++++++++++++++++ .../Exceptions/Interfaces/IHasValidation.cs | 13 +++++ .../SimplifyExceptionsMiddleware.cs | 15 +++++- 4 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 AsbCloudApp/Exceptions/ArgumentsInvalidException.cs create mode 100644 AsbCloudApp/Exceptions/Interfaces/IHasValidation.cs diff --git a/AsbCloudApp/Exceptions/ArgumentInvalidException.cs b/AsbCloudApp/Exceptions/ArgumentInvalidException.cs index b8014098..4b1abd34 100644 --- a/AsbCloudApp/Exceptions/ArgumentInvalidException.cs +++ b/AsbCloudApp/Exceptions/ArgumentInvalidException.cs @@ -1,11 +1,13 @@ using System; +using AsbCloudApp.Exceptions.Interfaces; namespace AsbCloudApp.Exceptions { /// /// Argument validation fail Exception /// - public class ArgumentInvalidException : Exception + public class ArgumentInvalidException : Exception, + IHasValidation { /// /// название аргумента @@ -27,7 +29,7 @@ namespace AsbCloudApp.Exceptions /// преобразование в объект валидации /// /// - public object ToValaidationErrorObject() + public object ToValidationErrorObject() => MakeValidationError(ParamName, Message); /// diff --git a/AsbCloudApp/Exceptions/ArgumentsInvalidException.cs b/AsbCloudApp/Exceptions/ArgumentsInvalidException.cs new file mode 100644 index 00000000..afc38b03 --- /dev/null +++ b/AsbCloudApp/Exceptions/ArgumentsInvalidException.cs @@ -0,0 +1,47 @@ +using System; +using AsbCloudApp.Exceptions.Interfaces; + +namespace AsbCloudApp.Exceptions; + +/// +/// +/// +public class ArgumentsInvalidException : Exception, + IHasValidation +{ + /// + /// + /// + public string[] ParamNames { get; } = Array.Empty(); + + /// + /// + /// + /// + /// + public ArgumentsInvalidException(string message, + string[] paramNames) + { + ParamNames = paramNames; + } + + /// + /// + /// + /// + public object ToValidationErrorObject() + => MakeValidationError(ParamNames, Message); + + /// + /// + /// + /// + /// + /// + public static object MakeValidationError(string[] paramNames, params string[] errors) + => new + { + names = paramNames, + errors, + }; +} \ No newline at end of file diff --git a/AsbCloudApp/Exceptions/Interfaces/IHasValidation.cs b/AsbCloudApp/Exceptions/Interfaces/IHasValidation.cs new file mode 100644 index 00000000..c4759b1b --- /dev/null +++ b/AsbCloudApp/Exceptions/Interfaces/IHasValidation.cs @@ -0,0 +1,13 @@ +namespace AsbCloudApp.Exceptions.Interfaces; + +/// +/// +/// +public interface IHasValidation +{ + /// + /// + /// + /// + object ToValidationErrorObject(); +} \ No newline at end of file diff --git a/AsbCloudWebApi/Middlewares/SimplifyExceptionsMiddleware.cs b/AsbCloudWebApi/Middlewares/SimplifyExceptionsMiddleware.cs index 589d8f9f..55e8c67c 100644 --- a/AsbCloudWebApi/Middlewares/SimplifyExceptionsMiddleware.cs +++ b/AsbCloudWebApi/Middlewares/SimplifyExceptionsMiddleware.cs @@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Http; using System; using System.IO; using System.Threading.Tasks; +using AsbCloudApp.Exceptions.Interfaces; namespace AsbCloudWebApi.Middlewares { @@ -30,6 +31,15 @@ namespace AsbCloudWebApi.Middlewares var body = MakeJsonBody(ex); await context.Response.WriteAsync(body); } + catch (ArgumentsInvalidException ex) + { + Console.WriteLine($"ArgumentExceptions in {context.Request.Method}: {ex.Message}"); + context.Response.Clear(); + context.Response.StatusCode = 400; + context.Response.ContentType = "application/json"; + var body = MakeJsonBody(ex); + await context.Response.WriteAsync(body); + } catch (ForbidException ex) { Console.WriteLine($"ForbidException in {context.Request.Method}: {ex.Message}"); @@ -49,9 +59,10 @@ namespace AsbCloudWebApi.Middlewares } } - private static string MakeJsonBody(ArgumentInvalidException ex) + private static string MakeJsonBody(TException ex) + where TException: Exception, IHasValidation { - object error = ex.ToValaidationErrorObject(); + object error = ex.ToValidationErrorObject(); var buffer = System.Text.Json.JsonSerializer.Serialize(error); return buffer; }