MVC Framework - Manejo de excepciones

En ASP.NET, el manejo de errores se realiza usando el enfoque estándar try catch o usando eventos de aplicación. ASP.NET MVC viene con soporte integrado para el manejo de excepciones usando una característica conocida como filtros de excepción. Vamos a aprender dos enfoques aquí: uno para anular el método onException y otro para definir los filtros HandleError.

Anular el método OnException

Este enfoque se usa cuando queremos manejar todas las excepciones a través de los métodos de acción en el nivel del controlador.

Para comprender este enfoque, cree una aplicación MVC (siga los pasos cubiertos en los capítulos anteriores). Ahora agregue una nueva clase de controlador y agregue el siguiente código que anula el método onException y arroja explícitamente un error en nuestro método de acción:

Ahora creemos una vista común llamada Errorque se mostrará al usuario cuando ocurra alguna excepción en la aplicación. Dentro de la carpeta Vistas, cree una nueva carpeta llamada Compartida y agregue una nueva Vista llamada Error.

Copie el siguiente código dentro del Error.cshtml recién creado:

Si intenta ejecutar la aplicación ahora, dará el siguiente resultado. El código anterior muestra la Vista de error cuando ocurre alguna excepción en cualquiera de los métodos de acción dentro de este controlador.

La ventaja de este enfoque es que múltiples acciones dentro del mismo controlador pueden compartir esta lógica de manejo de errores. Sin embargo, la desventaja es que no podemos usar la misma lógica de manejo de errores en varios controladores.

Atributo HandleError

El atributo HandleError es uno de los filtros de acción que estudiamos en el capítulo Filtros y filtros de acción. HandleErrorAttribute es la implementación predeterminada de IExceptionFilter. Este filtro maneja todas las excepciones generadas por las acciones, filtros y vistas del controlador.

Para usar esta función, primero active la sección customErrors en web.config. Abra web.config y coloque el siguiente código dentro de system.web y establezca su valor como Activado.

<customErrors mode = "On"/>

Ya tenemos la Vista de error creada dentro de la carpeta Compartida en Vistas. Esta vez, cambie el código de este archivo de vista al siguiente, para escribirlo firmemente con el modelo HandleErrorInfo (que está presente en 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>

Ahora coloque el siguiente código en su archivo de controlador que especifica el atributo [HandleError] en el archivo 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(); 
      } 
   } 
}

Si intenta ejecutar la aplicación ahora, obtendrá un error similar al que se muestra en la siguiente captura de pantalla.

Como puede ver, esta vez el error contiene más información sobre el controlador y los detalles relacionados con la acción. De esta manera, HandleError se puede utilizar en cualquier nivel y en todos los controladores para manejar dichos errores.