¿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

Published 8/3/2007 10:03 por Sergio Vazquez
Archivado en:
Comparte este post:

Comentarios

Thursday, June 7, 2007 1:25 AM por SergioT

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

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

Friday, September 21, 2007 3:35 PM por Andres

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

Al leer estas respuestas me doy cuenta cada dia lo ignorante que sigo siendo...uf, excelente corrección..Voy a implementarla en mis proyectos.