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
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
Al leer estas respuestas me doy cuenta cada dia lo ignorante que sigo siendo…uf, excelente corrección..Voy a implementarla en mis proyectos.