Como fazer tratativas no ASP.NET Core 2.0 usando Filters
Fala pessoal, beleza? Neste post venho dar algumas dicas sobre tratamento de erros em ASP.NET Core 2.0, de forma a facilitar sua vida para identificar problemas e/ou exibir mensagens ao usuário final.
Todos sabemos que erros em APIs REST às vezes podem ser muito difíceis de identificar, e efetuar tratamento individual para todos os seus endpoints utilizando try e catch pode ser muito trabalhoso, e às vezes ineficiente. Por conta disso, resolvi trazer algumas dicas que utilizo no dia a dia e que facilitam bastante o tratamento de erros, deixando o código limpo e elegante.
Vamos ver os seguintes tópicos:
- Exception Filter
- Action Filter
- Log de execução com Serilog
Então vamos lá!
1. Exception Filter
Consiste em cadastrar classes que executam código antes ou depois de determinados estágios do pipeline de processamento da aplicação.
O Exception Filter trata exatamente disso; é uma classe que criamos com o intuito de capturar todas as exceptions disparadas pela nossa aplicação, para podermos trata-las em apenas um único local. Dessa forma, não precisamos de try e catch em local nenhum da aplicação; qualquer exception levantado cairá nesta classe, onde será possível tratar este erro e retorná-lo em um formato conhecido para quem está consumindo nossa API. É uma forma simples e elegante de deixar seu código limpo.
Para criar um Exception Filter, primeiramente devemos criar uma classe implementando a interface de IExceptionFilter.
Nesta classe, iremos fazer override do método OnException, que nos permite capturar o contexto em que ocorreu a exception. A partir deste contexto conseguimos identificar o erro, efetuar o tratamento e retorna-lo ao front.
Neste exemplo eu alterei o status da requisição para Internal Server Error (500), coloquei o ContentType da response como “application/json” e converti a exception para JSON, salvando ela no body da response.
Desta forma, qualquer erro que acontecer na API passará por este método, que pode fazer o tratamento, converter o erro para alguma classe de retorno e enviar como resposta a quem solicitou, nos permitindo até mesmo traduzir erros conhecidos.
Segue um exemplo mais complexo da classe onde eu identifico algumas exceptions, faço traduções pelo resource, converto classes, etc.
Lembrando que a classe nos permite injetar dependências pelo construtor, possibilitando adicionar resources, loggers, etc, o que permite uma grande flexibilidade no tratamento das exceptions.
Após criar a classe, precisamos adicioná-la aos filtros do ASP.NET Core.
Para isto, basta abrir a classe Startup.cs, e no método ConfigureServices, adicionar o Filter criado.
Após isto, só correr para o abraço. Sua aplicação *provavelmente* já está tratando as exceções na sua classe de filter.
2. Action Filter
O Action Filter, nada mais é que um Attribute do ASP.NET. através deles podemos marcar métodos da controller para executar ações antes do método ser efetivamente executado.
Neste caso, demonstrarei como validar se a model recebido pela sua controller é válida.
Para tal, criamos um Attribute que herda de ActionFilterAttribute.
Precisamos agora fazer override no método OnActionExecuting, o qual nos disponibiliza o context como parâmetro, e neste context podemos validar o ModelState, e nesta validação levantar uma exceção, que cairá no nosso ExceptionFilter para tratar seu retorno.
Agora, para utilizar este Attribute, basta marcar os métodos em sua controller que irão utilizá-lo.
Pronto! Agora este método validará se o model recebido como parâmetro foi corretamente formatado.
Se quisermos especificar mais, e detalhar a mensagem de erro, podemos capturar as exceptions detalhadamente para identificar exatamente onde a model está mal formatada.
3. Log de execução com Serilog
Por fim, vou demonstrar algo rápido e simples de se implementar, mas muito útil!
O serilog irá rastrear todas as chamadas à api, detalhando em qual método ocorreu erro, qual exception foi levantada, e muitos outros detalhes que facilitam bastante identificar erros na api.
Para implementa-lo, é incrivelmente fácil:
-
- Instalar via nuget o pacote Serilog.Extensions.Logging.File;
- Adicionar a sessão “Logging” no appsettings.json;
-
- Adicionar ao método Configure do arquivo Startup.cs a interface ILoggerFactory e configurá-la, adicionando a sessão Logging configurada anteriormente a ela, e definindo um local para salvar o arquivo de log.
É só isso, e pronto! A partir de agora, todas as chamadas à api serão logadas.
Então, é isto que eu gostaria de compartilhar hoje.
Espero que tenham gostado.
Um grande abraço, valeu!