¿Como gestiono errores en mi aplicacion ASP.NET en tiempo de ejecución?

Se acerca la primavera que, como muchos sabéis, la sangre altera y puede producir errores en nuestro código con más frecuencia de la habitual :-). Hay veces que queremos personalizar los mensajes de error en tiempo de ejecución que arroja nuestra aplicación cuando se produce una excepción en nuestro código porque no está disponible la base de datos o cuando no se encuentra una página de nuestro sitio web. Para ello veo tres opciones muy claras y habituales:


1- Configurar la web para que no de información detallada del error que pueda servir a un atacante


Esto se hace desde el web.config. Unas líneas de código creo que valen mas que mil palabras y muchos conocemos codigos http 404 de pagina no encontrada y 403 de acceso no permitido para redirigirlos a una página .aspx hecha por nosotros:


<customErrors mode=»RemoteOnly» defaultRedirect=»AppErrors.aspx»>
   <error statusCode=»404″ redirect=»NoSuchPage.aspx»/>
   <error statusCode=»403″ redirect=»NoAccessAllowed.aspx»/>
</customErrors>


2.- Control estructurado de excepciones con Try.Catch. Aquí tenéis otro ejemplo sencillo de captura de error en la conexion a una base de datos donde la propiedad Message de la excepcion ex guarda el error producido. Recordar que el bloque finally siempre se ejecuta


Try
   SqlConnection1.Open()
   SqlDataAdapter1.Fill(Me.DsPubs1)
Catch ex As Exception
   If HttpContext.Current.Request.UserHostAddress = «127.0.0.1» Then
      Session(«CurrentError») = ex.Message
    Else
      Session(«CurrentError») = «Error processing page.»
    End If
    Server.Transfer(«ApplicationError.aspx»)
Finally
       SqlConnection1.Close()
End Try


3.- Crear un manejador global de errores en el global.asax.


 Hay un evento en el global.asax que nos permite capturar el error y redirigir a otra página como se ve en estas líneas de código en el que se guarda en  Server.GetLastError.Message el último error producido en la aplicacion:


Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
   Session(«CurrentError») = «Global: » & Server.GetLastError.Message
   Server.Transfer(«lasterr.aspx»)
End Sub


Espero os sean de utilidad para vuestras aplicaciones web ASP.NET como lo son para mi en mi trabajo diario.


Saludos


Sergio Vázquez

2 comentarios sobre “¿Como gestiono errores en mi aplicacion ASP.NET en tiempo de ejecución?”

  1. Hola tocayo

    He probado el codigo de la centralizacion de errores en el global.asax, pero encuentro un caso en el que no puedo utilizar session ahi por que está fuera de contexto, es como si no se permitiera utilizar a session en evento en ciertos tipos de errores.

    Por lo que entiendo hay un momento al iniciarse la solicitud en el cual el objeto session no esta disponible y en ese instante al producirse y llegar al Application_Error se produce un segundo error ya que session no está disponible. Por tanto puede haber un «hueco» en esta centralizacion , la pregunta del millón seria como capturas esos errores?

    En el caso concreto de mi error resulta que mi proyecto web hacia referencia a una version de assembly donde tengo tableAdapters los que uso para enlazar a grids, y resulta que mi proyecto BLL hace tambien referencia a ese assembly pero dio la casualidad que no era la ultima y se produjo un conflicto de versiones que resultó en la generacion del error

    Si me permites cambiaria un poquito el codigo a esta forma,

    Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
    ‘ Se desencadena cuando ocurre un error
    Try
    Dim oErr As Exception
    oErr = Server.GetLastError.InnerException
    Session(«Errores») = «Global: » & _
    Server.GetLastError.Message & » errrooorr: » & oErr.ToString
    Response.Redirect(Request.ApplicationPath & «/ErrorPage.aspx»)

    Catch ex As Exception

    End Try

    End Sub

    de esta forma no pierdo el error original

    salu2
    SergioT

Responder a anonymous Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *