.NET

31 out, 2018

ASP .NET Core MVC: tratamento de exceções – Parte 01

Publicidade

Neste artigo veremos como realizar o tratamento de erros em aplicações ASP .NET Core MVC.

A recomendação da documentação da ASP .NET Core para configurar a sua aplicação para exibir uma página que mostra informações detalhadas sobre exceções, é: usar a página de exceção do desenvolvedor.

Esta página é disponibilizada pelo pacote Microsoft.AspNetCore.Diagnostics, que está disponível no metapacote Microsoft.AspNetCore.App.

A seguir, coloque a chamada para UseDeveloperExceptionPage na frente de qualquer middleware no qual você deseja capturar exceções, tais como app.UseMvc.

Para simular uma exceção, coloque na frente da url base da aplicação o código: ?throw=true.

Dessa forma, ao criar uma nova aplicação ASP .NET Core MVC, o middleware ExceptionHandler já é fornecido por padrão. Com ele podemos capturar quaisquer exceções não tratadas dentro da nossa aplicação e permitiremos o direcionamento para uma rota especificada.

Por exemplo, o seguinte método de manipulador de erro é fornecido no controlador Home:

[AllowAnonymous]
public IActionResult Error()
{
    return View(new ErrorViewModel 
        { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}

Mas e os outros códigos de status de operações que não tiveram sucesso?

Erros como 404, 400, 401, etc, não serão capturados por esse middleware, pois nenhuma exceção foi lançada.

Para lidar com esses tipos de erros, podemos usar o middleware StatusCodePages e, neste artigo, veremos como configurar a aplicação MVC para manipular os dois tipos de exceções e os códigos de status que não são bem-sucedidos.

Recursos usados:

Criando o projeto no VS 2017

Começaremos criando uma aplicação ASP .NET Core MVC usando o template padrão.

Abra o VS 2017 Community e crie um novo projeto ASP .NET Core usando o template Web Application (Model-View-Controller).

  • Create New Project;
  • Visual C# -> .NET Core -> ASP .NET Core Web Application;
  • Informe o nome AspCoreMvc_TrataExceptions

Clique em OK, e a seguir selecione o template Web Application (Model-View-Controller), marque ASP .NET Core 2.0 e clique em OK;

Ao clicar no botão OK teremos o projeto criado com a estrutura abaixo:

Vemos a estrutura do projeto contendo as referências e as pastas Controllers, Models e Views, bem como os arquivos Startup e appsettings.json.

Usaremos esses recursos para criar nossa aplicação ASP .NET Core MVC.

Manipulando exceções não tratadas

Quando criamos uma aplicação ASP .NET Core MVC, o template cria um projeto padrão contendo a classe Startup e o método Configure mostrado abaixo:

Observe a linha de código destacada: app.UseExceptionHandler(“/Home/Error”);.

Essa instrução esta registrando o middleware ExceptionHandler e vai direcionar o usuário para a rota /Home/Error sempre que uma exceção não tratada ocorrer.

Vamos alterar essa linha de código para: app.UseExceptionHandler(“/Error/500”);.

A seguir incluiremos um novo controlador em nosso projeto na pasta Controllers, chamado ErrosController, que vai tratar todos os erros da nossa aplicação.

Clicando com o botão direito do mouse na pasta Controllers e acionando Add > Controller, selecione o template MVC Controller Empty e informe o nome ErrosController.

A seguir, inclua o código abaixo no controlador definindo o método Action Error500():

Vamos entender esse código:

Estamos usando o atributo de roteamento: [HttpGet(“Error/500”)] (se preferir, você pode usar o template route padrão).

A seguir, estamos usando o recurso IExceptionHanderPathFeature para obter informações e mais detalhes sobre o que deu errado em nossa aplicação.

Quando o middleware ExceptionHandler é executado, ele define um item na coleção Features para o request chamado IExceptionHandlerPathFeature. Este é um dos dois recursos adicionados, o outro é IExceptionHandlerFeature.

Ambos contêm uma propriedade chamada Error, que possui os detalhes da exceção, mas o IExceptionHandlerPathFeature também contém o caminho a partir do qual a exceção foi lançada. Assim, usamos esse recurso para obter informações do caminho do erro também.

A seguir, com a informação obtida, e para tornar o exemplo mais simples, estamos atribuindo as informações da exceção obtida a duas ViewBag de forma a podermos exibí-las em uma view. Numa aplicação de produção, o mais correto seria logar as informações dos erros e exibir uma mensagem mais amigável ao usuário final.

Uma implementação bem simples para a respectiva view Error500.cshtml e exibida a seguir:

Dessa forma, bem simples por sinal, podemos manipular qualquer exceção não tratada em nossa aplicação, e a seguir, exibir os detalhes da exceção lançada.

Na próxima parte do artigo veremos como tratar com problemas não baseados em exceções, como um 404 ou qualquer código de status que não seja de sucesso que nossa aplicação gerar.