Cómo hacer para que las sentencias SQL mal formadas no den errores en las páginas ASP y se puedan tratar para informar al usuario o administrador.
Vamos a ver un pequeño taller que puede servir para hacer nuestras aplicaciones ASP más completas y compactas. Se trata de evitar un error bastante frecuente en la programación de páginas, que ocurre cuando se intenta ejecutar una sentencia SQL mal formada. En esos casos, el servidor nos informa del error, aunque siempre ofrece información que no sirve de mucho al visitante, incluso despista. Sería preferible que nosotros tratásemos el error e informáramos por nuestra cuenta al usuario, de una manera agradable y clara.
Para ello vamos a realizar un tratamiento de errores en ASP, que evitará que la página se detenga ante un error y nos permita hacer cosas si ocurre.
On error Resume Next
conn.execute(ssql)
if Err<>0 then
' realizo acciones para tratar el error
end if
Con la primera línea estamos diciendo a ASP que si ocurre un error no informe de ello, sino que continúe. En la segunda línea ejecutamos una sentencia SQL.
En el siguiente bloque se evalúa la variable de sistema "Err", que almacena un posible error. Si la variable vale cualquier cosa distinto de 0, entonces es que ocurrió un error. Por tanto, en el caso positivo del if podremos realizar cualquier tipo de acción para tratar el error.
Tratar el error de una manera sencilla
Para tratar el error de una manera fácil de implementar, dentro del if podríamos llamar a una función que se encargase de hacer todas las acciones frente a un error.
Esa función podría recibir el error e introducirlo en un log de errores. Podría también informar por correo al administrador y por supuesto, mostrar un mensaje de error claro al visitante.
sub tratar_error_ssql(ssql,mierror)
'trato el posible error
'meto la sentencia erronea en un archivo de texto
'creamos el textstream del archivo
archivo= request.serverVariables("APPL_PHYSICAL_PATH") & "errores\log.txt"
set confile = createObject("scripting.filesystemobject")
set fich = confile.OpenTextFile (archivo,8)
'escribo en el archivo
fich.WriteLine(ssql)
fich.WriteLine(Err.Description)
fich.WriteLine("-----------------------------")
'cerramos el fichero
fich.close()
'voy a informar al administrador
set obj_mail = server.createObject("Persits.MailSender")
asunto_mensaje = "Error SQL en la página"
email_origen_mensaje = "correo@dominio.com"
texto_origen_mensaje = "Empresa"
txt_mail = "Hemos detectado un error. Consulte el log de errores para encontrar descripción."
txt_mail = txt_mail & VBNEWLINE & VBNEWLINE & ssql
txt_mail = txt_mail & VBNEWLINE & VBNEWLINE & mierror
obj_mail.host = "smtp.dominio.com"
obj_mail.from = email_origen_mensaje
obj_mail.FromName = texto_origen_mensaje
obj_mail.Subject = asunto_mensaje
obj_mail.AddAddress email_alertas
obj_mail.body = txt_mail
'lo envio
obj_mail.send
'voy a informar al usuario
response.write "Lo sentimos, pero tu acción no ha podido ser realizada. Ponte en contacto con los administradores para obtener ayuda."
end sub
Esta función hace todo lo comentado para tratar el error. Primero escribe el log de errores en un fichero de texto, luego envía un correo electrónico al administrador y finaliza mostrando un error al usuario. Está comentada para entenderla mejor y todo lo que hemos realizado (como enviar el email desde ASP o abrir el fichero de texto) lo hemos visto ya en otros talleres de ASP.
Para ello vamos a realizar un tratamiento de errores en ASP, que evitará que la página se detenga ante un error y nos permita hacer cosas si ocurre.
On error Resume Next
conn.execute(ssql)
if Err<>0 then
' realizo acciones para tratar el error
end if
Con la primera línea estamos diciendo a ASP que si ocurre un error no informe de ello, sino que continúe. En la segunda línea ejecutamos una sentencia SQL.
En el siguiente bloque se evalúa la variable de sistema "Err", que almacena un posible error. Si la variable vale cualquier cosa distinto de 0, entonces es que ocurrió un error. Por tanto, en el caso positivo del if podremos realizar cualquier tipo de acción para tratar el error.
Tratar el error de una manera sencilla
Para tratar el error de una manera fácil de implementar, dentro del if podríamos llamar a una función que se encargase de hacer todas las acciones frente a un error.
Esa función podría recibir el error e introducirlo en un log de errores. Podría también informar por correo al administrador y por supuesto, mostrar un mensaje de error claro al visitante.
sub tratar_error_ssql(ssql,mierror)
'trato el posible error
'meto la sentencia erronea en un archivo de texto
'creamos el textstream del archivo
archivo= request.serverVariables("APPL_PHYSICAL_PATH") & "errores\log.txt"
set confile = createObject("scripting.filesystemobject")
set fich = confile.OpenTextFile (archivo,8)
'escribo en el archivo
fich.WriteLine(ssql)
fich.WriteLine(Err.Description)
fich.WriteLine("-----------------------------")
'cerramos el fichero
fich.close()
'voy a informar al administrador
set obj_mail = server.createObject("Persits.MailSender")
asunto_mensaje = "Error SQL en la página"
email_origen_mensaje = "correo@dominio.com"
texto_origen_mensaje = "Empresa"
txt_mail = "Hemos detectado un error. Consulte el log de errores para encontrar descripción."
txt_mail = txt_mail & VBNEWLINE & VBNEWLINE & ssql
txt_mail = txt_mail & VBNEWLINE & VBNEWLINE & mierror
obj_mail.host = "smtp.dominio.com"
obj_mail.from = email_origen_mensaje
obj_mail.FromName = texto_origen_mensaje
obj_mail.Subject = asunto_mensaje
obj_mail.AddAddress email_alertas
obj_mail.body = txt_mail
'lo envio
obj_mail.send
'voy a informar al usuario
response.write "Lo sentimos, pero tu acción no ha podido ser realizada. Ponte en contacto con los administradores para obtener ayuda."
end sub
Esta función hace todo lo comentado para tratar el error. Primero escribe el log de errores en un fichero de texto, luego envía un correo electrónico al administrador y finaliza mostrando un error al usuario. Está comentada para entenderla mejor y todo lo que hemos realizado (como enviar el email desde ASP o abrir el fichero de texto) lo hemos visto ya en otros talleres de ASP.
Miguel Angel Alvarez
Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...