MVC Framework - Tratamento de exceções

No ASP.NET, o tratamento de erros é feito usando a abordagem padrão try catch ou usando eventos de aplicativo. A ASP.NET MVC vem com suporte embutido para tratamento de exceções usando um recurso conhecido como filtros de exceção. Vamos aprender duas abordagens aqui: uma com a substituição do método onException e outra definindo os filtros HandleError.

Substituir Método OnException

Essa abordagem é usada quando queremos tratar todas as exceções entre os métodos de ação no nível do controlador.

Para entender essa abordagem, crie um aplicativo MVC (siga as etapas abordadas nos capítulos anteriores). Agora adicione uma nova classe Controller e adicione o seguinte código que sobrescreve o método onException e lança explicitamente um erro em nosso método Action -

Agora vamos criar uma visão comum chamada Errorque será mostrado ao usuário quando ocorrer alguma exceção no aplicativo. Dentro da pasta Views, crie uma nova pasta chamada Shared e adicione uma nova View chamada Error.

Copie o seguinte código dentro do Error.cshtml recém-criado -

Se você tentar executar o aplicativo agora, terá o seguinte resultado. O código acima renderiza a Visualização de Erro quando ocorre alguma exceção em qualquer um dos métodos de ação dentro deste controlador.

A vantagem dessa abordagem é que várias ações no mesmo controlador podem compartilhar essa lógica de tratamento de erros. No entanto, a desvantagem é que não podemos usar a mesma lógica de tratamento de erros em vários controladores.

Atributo HandleError

O Atributo HandleError é um dos filtros de ação que estudamos no capítulo Filtros e Filtros de ação. O HandleErrorAttribute é a implementação padrão de IExceptionFilter. Este filtro lida com todas as exceções levantadas por ações, filtros e visualizações do controlador.

Para usar este recurso, primeiro ative a seção customErrors em web.config. Abra o web.config e coloque o seguinte código dentro de system.web e defina seu valor como On.

<customErrors mode = "On"/>

Já temos a Error View criada dentro da pasta Shared em Views. Desta vez, altere o código deste arquivo de visualização para o seguinte, para digitá-lo fortemente com o modelo HandleErrorInfo (que está presente em System.Web.MVC).

@model System.Web.Mvc.HandleErrorInfo 

@{ 
Layout = null; 
} 
  
<!DOCTYPE html> 
<html> 
   <head> 
      <meta name = "viewport" content = "width = device-width" /> 
      <title>Error</title> 
   </head> 
   
   <body> 
      <h2> 
         Sorry, an error occurred while processing your request.  
      </h2> 
      <h2>Exception details</h2> 
      
      <p> 
         Controller: @Model.ControllerName <br> 
         Action: @Model.ActionName 
         Exception: @Model.Exception 
      </p> 
   
   </body> 
</html>

Agora coloque o seguinte código em seu arquivo de controlador que especifica o atributo [HandleError] no arquivo de controlador.

using System; 
using System.Data.Common; 
using System.Web.Mvc;  

namespace ExceptionHandlingMVC.Controllers { 
   [HandleError] 
   public class ExceptionHandlingController : Controller { 
      
      public ActionResult TestMethod() { 
         throw new Exception("Test Exception"); 
         return View(); 
      } 
   } 
}

Se você tentar executar o aplicativo agora, obterá um erro semelhante ao mostrado na imagem a seguir.

Como você pode ver, desta vez o erro contém mais informações sobre o controlador e os detalhes relacionados à ação. Dessa forma, o HandleError pode ser usado em qualquer nível e entre controladores para lidar com esses erros.