Informe completo de errores con VB

Espero que lo que voy a pedir no sea imposible, vamos a ver: La idea es mostrar un informe completo cuando se produce un error inesperado, me explico, cuando se produce un error inesperado me gustaría poder sacar un mensaje que me ponga el nombre de la función o procedimiento que lo ha generado, que valores tenían las variables en ese momento, etc. Si existiera alguna librería, API, o cualquier otra herramienta, la cual dijera el nombre de la función o el procedimiento en el que se está y además poder recorrer la "coleccion" de variables, seria la repera. Creo que con esta utilidad se pueden depurar muchos errores de una manera más rápida. No creéis.

1 Respuesta

Respuesta
1
Para depurar errores tené la función
On Error, al utilizarla podes capturar un error e ir a una subrutina especial en la que generas el informe, podes parar o no la aplicación, te doy un ejemplo:
On Error GoTo errores
Dim paso As Byte
paso = 1254
Exit Sub
errores:
MsgBox Err.number & " " & Err.Description
Esto genera un error y te muestra un mensaje con el numero de erroy y su descripción, fíjate que no se detiene la ejecucuin del programa, por eso vos por código podes leer el estado de las variables que quieras y generar un informe en pantalla a tu gusto.
Esto lo pondrías en todas las funciones, por lo tanto tienes el informe o procesamiento de errores personalizado para cada una de las funciones.
De esta manera, al evitar que el programa se salga de ejecución, también podes corregir los errores, no solo mostrarlos.
Para los errores inesperados, si te aparece alguno es debido a una falla del sistema operativo, ese no lo depuras de tu programa.
Cualquier duda estoy a tu disposición.
Creo que no has entendido bien lo que quiero decir, la función que requiero es para cuando dan errores en tiempo de ejecución, ya instalado en el ordenador del cliente (que son mis compañeros de trabajo, por eso cuando les salga un error me avisaran y podre apuntar los datos del mismo)
Entonces la idea es que cuando les de un error, les diga aparte de la descripción del error, les diga la función o el procedimiento que lo ha dado y el estado de las variables, seria la ostia si existiera alguna función que dijera actualmente en que función se esta actualmente y poder recorrer la "coleccion" de variables.
Así pues cuando se produce un error y capturado por la instrucción OnError llama a la subrrutina que muestra algo parecido a esto:
Se ha producido un error: descrición
Función o Procedimiento: nombre función
Valores de las variables actualmente en uso:
intI = 5
lngZ = 15
strAux = "Cadena"
mstrConexion = "Conectado"
Creo que ahora me he explicado mejor ¿Verdad?, Gracias Anticipadas, Un Saludo.
Si, este método se utiliza para capturar, corregir e informar de un error en tiempo de ejecución de una aplicación ya compilada e instalada en una maquina, no es para cuando la estas programando, para eso esta el debuger de visyual y el mismo visual es el que te frena la ejecución, te muestra la linea y te dice cual es el error.
Vos al poner estas funciones dentro de tus subrutinas, te aseguras de que si se produce un error, este le sea informado al usuario( tus compañeros de trabajo), de en que subrutina, y cual es el error.
En el ejemplo que te di anteriormente, fíjate que le informa al usuario el numero de error y su descripción, y no se detiene la ejecucuion del programa, si ese error se produciría sin la rutina de captura de errores, al usuario solo se le informaría de que se produjo un error en tiempo de ejecución, y esto finaliza el programa, con perdidas seguras de datos.
El informe al que te referís en tu ejemplo lo armarías así:
Pone esto en un botón y prova si te sirve
On Error GoTo errores
Dim strAux As String
Dim mstrConexion As String
Dim intl As Byte
Dim ingZ As Single
strAux = "Prueba"
mstrConexion = "Conectado"
'aca se ejecuta por ejemplo tu rutina de transmision de datos
ingZ = 1200
intl = 1200
Exit Sub
'si se produce un error vos pones:
errores:
asd = MsgBox("Se ha producido un error: " & Err.Description & Chr(13) _
& "Función o Procedimiento: Rutina de Transmision" & Chr(13) _
& "Valores de las variables actualmente en uso:" & Chr(13) _
& "intI = " & intI & Chr(13) _
& "lngZ = " & lngZ & Chr(13) _
& "strAux = " & strAux & Chr(13) _
& "mstrConexion = mstrConexion ", vbCritical, "Informe de Error")
Cualquier duda estoy a tu disposición.
Si esto es lo que yo quiero, pero es muy manual y costoso ¿verdad?, debería de poner esa rutina en todas las funciones y procedimientos.
Existe alguna manera de recorrer automáticamente todas las variables que estén actualmente en uso, ¿sin necesidad de poner el nombre de todas? (Como si de recorrer los controles y las propiedades de estos en los formularios se tratara), y de que diera automáticamente el nombre de la función en la que esta, sin necesidad por ejemplo de crear una variable publica y ponerle el nombre de la función cada vez que entra.
Se empieza a complicar la cosa ¿verdad?
Gracias otra vez, espero tu contestación. Un saludo.
Lo que podes hacer para facilitar un poco el tema es declarar una Función dentro de un Modulo.
Por ejemplo:
Public Function MostrarError(descerr As String, Suberr As String, var1 As String, val1 As String, var2 As String, val2 As String, var3 As String, val3 As String, var4 As String, val5 As String)
Dim MensajeError As String
MensajeError = "Se produjo un ERROR = " & descerr & Chr(13)
MensajeError = MensajeError & "Subrutina = " & Suberr & Chr(13)
MensajeError = MensajeError & "Valores de las variables actualmente en uso:" & Chr(13)
If Not var1 = "" Then
MensajeError = MensajeError & var1 & " = " & val1 & Chr(13)
End If
If Not var2 = "" Then
MensajeError = MensajeError & var2 & " = " & val2 & Chr(13)
End If
If Not var3 = "" Then
MensajeError = MensajeError & var3 & " = " & val3 & Chr(13)
End If
If Not var4 = "" Then
MensajeError = MensajeError & var4 & " = " & val4 & Chr(13)
End If
x = MsgBox(MensajeError, vbCritical, "Informe de Error")
End Function
Luego en las subrutinas que pueden haber problemas (fíjate que no todas las rutina puedes provocar errores) pones:
el la primer linea
On Error Goto Errores
y al final de la rutina pones:
Exit Sub
Errores:
Call MostrarError(Err.Description, "", "","", "", "", "", "", "", "")
en el ejemplo que te di seria:
On Error GoTo errores
Dim strAux As String
Dim mstrConexion As String
Dim intl As Byte
Dim ingZ As Single
strAux = "Prueba"
mstrConexion = "Conectado"
'aca se ejecuta por ejemplo tu rutina de transmision de datos
ingZ = 1200
intl = 1200
Exit Sub
'si se produce un error vos pones:
errores:
Call MostrarError(Err.Description, "Transmision", "strAux", strAux, "mstConexio", mstrConexion, "ingZ", Str(ingZ), "intl", Str(intl))
Te puse para que envíes a la función hasta 4 variables, vos podes agregar más o sacar alguna, la sintaxis de la función seria:
Call MostrarError(err.description,Nombre de la subrutina,nombre de la variable1, valor de la variable1, nombre de la variable2, valor de la variable2, nombre de la variable3, valor de la variable3, nombre de la variable4, valor de la variable4)
Fíjate que todos los campos son string, si pones algún valor numérico convertilo con str(numero),
si esto se te complica lo podes simplificar, si tienes pocas variables en el programa, podes hacer que la función te de el valor de todas las variables y vos solo le des la descripción del error y el nombre de la subrutina, yo se que esto es todo manual y medio complicado, pero si tienes una subrutina en la que no pones la captura de errores con On Error, no tienes manera de controlarlo, porque si vos no capturas el error lo hace Windows, y después de mostrarte "Error en tiempo de Ejecución" te cierra la aplicación, obviamente porque no sabe que hacer con tu programa, eso si o si lo tienes que escribir vos.
Hay veces en que la programación de control de errores es más compleja que el programa mismo, si quieres hacer una aplicación confiable, si o si tienes que tener en cuenta todos y cada uno de los errores que puedan aparecer.
No es nada complicado hacerlo como tu propones, pero es muy manual, no se puede acceder a las variables por ejemplo algo así
function error(strfunction as string, colVariables as collection)
Dim strmensaje as string
Dim varCollection as variant
strMensaje = "Se ha producido un error en la funcion: " & strFunction & vbcrlf
for each varCollection in varCollection
strMensaje=strMensaje & varCollection.Name & " = " & varCollection.Value & vbCrlf
Next
msgbox strMensaje
end function
Ves en este ejemplo no tengo necesidad de pasar las variables una por una, se puede pasar la "coleccion" de variables si existe o algo parecido para hacerlo más complicado, si se debe pasar el nombre de la función con todas las variables que están activas en la función, variables de entorno, de módulo, publicas, es un desmadre, porque existen funciones que tienen muchas variables, por ser cálculos muy complicados.
Gracias, Saludos
Para trabajar con una "colecion" de variables primero tienes que incluirlas todas, una por una dentro del objeto "Collection", y después tendrías que poder discriminar los variables que le pertenecen a cada función. Si quieres simplificarlo, lo que podrías hacer es generar una función de muestra de errores con por ejemplo un Select Case NumeroDeError
Y vos solo enviarías a la función el numero que le pertenece a cada subrutina, y vos dependiendo de que numero fuese, pondrías en el Case, las variables y el mensaje que quieres mostrar en el informe, en vez de llenar una colección de variables en cada subrutina, vos ya las tendrías acomodadas en un función.
Te vuelvo a aclara que todas las subrutinas tienen que tener el On Error Goto, de lo contrario si se produce un error, es windows quien lo captura.
Te recomiendo algo, yo programe muchas aplicaciones y siempre le di mucha importancia al tratamiento de errores, tienes que intentar predecir que subrutinas o funciones son las que te pueden generar error, y solo en esas pones la captura de errores, la mayoría de las subrutinas en un programa, es imposible que generen errores, si eso pasa siempre es por mala suerte(en realidad siempre tienes cargada una aplicación de terceros o algún driver que te genera errores en forma aleatoria, y contra eso no podes hacer nada, solo intentar que tu programa no haga lo mismo).

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas