Após utilizar ValidationBehavior
para realizar a validação no pipeline de requisições, precisei ajustar minhas exceções personalizadas para tratar as mensagens de erro. Encontrei uma solução que trata as exceções globalmente de forma padronizada utilizando Problem Details através da interface IExceptionHandler
, que utiliza o middleware UseExceptionHandler
integrado ao .NET.
Middleware de validação no pipeline de requisições em ASP.NET Core
Primeiramente, fiz alterações nas exceções personalizadas:
A classe base agora é abstrata.
As classes derivadas sobrescrevem seus métodos.
Para adicionar o tratamento de exceções global, o processo é simples.
Na camada de API, criei uma pasta chamada Exceptions e dentro dela a classe GlobalExceptionHandler
:
Definição da Classe
Esta linha define a classe GlobalExceptionHandler
, que implementa a interface IExceptionHandler
. Ela também utiliza o ILogger
para registrar logs.
Método TryHandleAsync
Este método é assíncrono e tenta lidar com exceções que ocorrem durante o processamento das requisições HTTP. Ele recebe o contexto HTTP (HttpContext
), a exceção (Exception
) e um token de cancelamento (CancellationToken
).
Criação de ProblemDetails
Aqui, um objeto ProblemDetails
é instanciado. Este objeto é utilizado para fornecer uma resposta de erro detalhada e padronizada. A propriedade Instance
é definida com o caminho da requisição atual.
Tratamento de Exceções de Validação
Este bloco de código verifica se a exceção é do tipo FluentValidation.ValidationException
. Se for, ele configura o título e o tipo da resposta de erro. Além disso, define o status HTTP para 400 (Bad Request) e adiciona os erros de validação à extensão errors
de ProblemDetails
.
Tratamento de Outras Exceções
Se a exceção não for de validação, este bloco configura o título da resposta de erro com a mensagem da exceção e define o status HTTP para 500 (Internal Server Error).
Registro do Log e Envio da Resposta
Nesta parte final, a mensagem de erro é registrada no log. A propriedade Status
de ProblemDetails
é configurada com o status da resposta HTTP. A resposta JSON é escrita e enviada ao cliente, completando o tratamento da exceção.
Este método retorna true
indicando que a exceção foi tratada com sucesso.
No arquivo Program.cs
, adicionei o seguinte código:
O código acima garante que a implementação seja registrada no contêiner de serviço do aplicativo junto com ProblemDetails
.
Essa abordagem padroniza o tratamento de exceções em toda a aplicação, tornando o processo de depuração e manutenção mais eficiente e consistente.
Testando
- Requisição
- Resposta
Você deve ter percebido que na saída do console aparecem logs adicionais que vêm diretamente do middleware integrado. Para remover esses logs, basta inserir um trecho de código no appsettings.json
: