Gestión de errores en todo el programa VB6
Resuelto
Usuario anónimo
-
Derdonn Mensajes publicados 15 Estado Miembro -
Derdonn Mensajes publicados 15 Estado Miembro -
Hola,
Voy a terminar haciendo una FAQ yo solo. Aquí va mi pregunta de forma simple: estoy buscando gestionar los errores bajo VB6. Claro, conozco la instrucción On Error Goto... pero lo que desearía es que, independientemente de qué procedimiento esté en curso, me lleve a un punto determinado. De hecho, no quiero escribir en cada una de las funciones On Error Goto y luego escribir un código de gestión de errores, sino que me gustaría que la gestión de errores sea global para todo el documento. Si alguien tiene una solución (si existe), ¡que no dude en decirla! gracias!
Voy a terminar haciendo una FAQ yo solo. Aquí va mi pregunta de forma simple: estoy buscando gestionar los errores bajo VB6. Claro, conozco la instrucción On Error Goto... pero lo que desearía es que, independientemente de qué procedimiento esté en curso, me lleve a un punto determinado. De hecho, no quiero escribir en cada una de las funciones On Error Goto y luego escribir un código de gestión de errores, sino que me gustaría que la gestión de errores sea global para todo el documento. Si alguien tiene una solución (si existe), ¡que no dude en decirla! gracias!
8 respuestas
-
Sí, es preferible y al final de la función, por el hecho, el If Err.Number > 0 Then ...
Puedes recuperar así el número y la descripción del error y pasarlos como parámetros a un procedimiento público:
Function myFonction() On Error Resume Next 'el código ... If Err.Number > 0 Then Call procErrmsg(Err.Number, Err.Description) Exit Fuction End If End Function ---------------------------------- Sub procErrmsg(ByVal numErr As Integer, ByVal msgErr As String) MsgBox msgErr, VbExclamation, "Error: " & numErr End Sub
;o)
Polux
--
«Lo que se comprende bien se expresa claramente, y las palabras para decirlo llegan fácilmente.»
Nicolas Boileau-
Muchas gracias, me molesta tener que pegar On Error Resume Next. Quizás no lo haga en todos sitios (por ejemplo no en el código de cada botón o en el código de cada menú) pero en cualquier caso tu función me resulta muy útil, y voy a guardar el error en un archivo de texto (y sí, hace falta que el error sea casi transparente).
¿la última preguntita: debe Err.Number volver a 0 automáticamente al salir de la función?
-
-
"Gracias, conozco .NET. " (?) -->
disculpa por haber interpretado mal tu frase: "¿Por qué en .Net las errores serían mejor gestionadas??? " había entendido: ¿Por qué, en .Net las errores serían mejor gestionadas?
"Un Goto gErr envía directamente a gErr: sin ejecutar todo el código. Lo cual puede ser problemático" -->
o puede tomar todo su interés. y luego el resume next posicionado después de la etiqueta gErr: permite volver en casos definidos. Un punto de parada después de la etiqueta permite ver cuándo se detecta un error (durante la depuración), en cuanto se da.
"No veo muchas diferencias entre un try/catch" -->
si, aunque sí! una gran que conozco: con el try/catch hay un sistema de subida de errores en la pila de llamadas de las funciones, los errores pueden gestionarse al nivel que desees, no me acuerdo muy bien con .NET tampoco pero debe hacer como los demás, creo! .
"buena noche" -->
gracias igualmente. -
Hola
sólo basta con crear un procedimiento público en un módulo separado.
te bastará entonces realizar un llamado a ese procedimiento
--
Chouba,
Pochard d’assaut .. -
Buenos días,
Aunque está permitido en VB, el "On Error Goto..." no es muy "limpio" ni muy fiable. Es preferible usar "On Error Resume Next" y recuperar el error haciendo:
If Err.Number > 0 Then .... End If.
Es una opinión personal, pero por experiencia ya no uso el "On Error Goto".
;o)
--
«Lo que se conceptúa bien se expresa claramente, y las palabras para decirlo llegan fácilmente.»
Nicolas Boileau -
Err.Number devuelve el número de error; no hace falta inicializarlo. Si no hay error, devuelve 0 simplemente.
Efectivamente, no es necesario pegar On Error Resume Next en todo el código. Hay que dirigirse a los procedimientos y funciones que podrían generar una excepción.
Buena suerte para la continuación.
;o)
Polux
--
«Lo que se comprende bien se expresa claramente, y las palabras para decirlo llegan solas.»
Nicolas Boileau -
De nada, es un placer
Buena continuación.
;o)
--
«Lo que se concibe bien se formula con claridad, y las palabras para decirlo llegan fácilmente.»
Nicolás Boileau -
Hola
perdón por la vieja publicación,
Sin embargo:
He mirado la fecha: ya es hora de pasar a .NET :-D, o a algo que gestione mejor los errores.
¿Me dirás:
Cómo llegaste a este mensaje si no te interesaba “VB6 Gestión de errores en todo el programa”?, ja, ja, es justo lo que buscaba, ¡lamentablemente! ^^ ( Office ... , programas antiguos ...)
... Muchas gracias también a ti.-
Hola,
¿Por qué en .Net los errores serían mejor gestionados ???
Basta con esforzarse en querer gestionarlos en VB.
Buena continuación.
;o)
--
«Lo que se concibe bien se enuncia claramente, y las palabras para decirlo llegan fácilmente.»
Nicolas Boileau- Olvidé precisar algo, eh, en realidad a mis recuerdos "on error goto" es más práctico (en comparación con "on error resume next"): el "on error resume next" de esta forma no previene ante un error incluso durante la depuración. esto es lo que propongo para los próximos:
Private Sub maSub()
On Error GoTo gErr
...
gErr:
If Err.Number = 2452 Then 'sin padre
Else
Resume Next
End Sub
después cuestión de limpieza .. tampoco soy muy maniático de la limpieza :-p.
después de ver el mensaje de Polux31 -->
Veo que eres muy atento en el foro Polux31, gracias a ti.
para la gestión de errores, estoy de acuerdo en que se puede hacer bien, pero para mí un "on error goto/resume" no vale un try/catch ! después tal vez sea posible hacer eso en VB6 (no es simple). pero incluso para mí .NET > VB6 (no necesariamente en todos los puntos) sin problema, si nunca lo has probado es la ocasión, además hay versiones gratuitas!
¡saludo! - Gracias, conozco .NET.
Para que conste: On Error Resume Next permite recuperar el error de la misma manera que On Error Goto. El Resume Next deja que el código se ejecute hasta la intercepción del error por un If Err.Number <> 0 Then ... por ejemplo. Un Goto gErr envía directamente a gErr: sin ejecutar todo el código. Eso puede ser engorroso
No veo muchas diferencias entre un try/catch y un On Error Goto o Resume Next. Ni en qué es mejor. Uno y el otro sirven para gestionar excepciones. Todo es cuestión de tomarse la molestia de usarlos.
buenas noches
;o)
--
«Lo que se concibe bien se formula con claridad, y las palabras para decirlo llegan fácilmente.»
Nicolás Boileau
-
-
Porque en 2011 todavía hay gente como yo que tiene que retomar proyectos en VB6 y se hacen preguntas existenciales que mil personas ya se habrán hecho mucho antes. Et aussi parce que ce topic apparaît en haut du moteur de recherche sans répondre complètement à la question brûlante, je me permets de compléter :
OUI il est obligatoire de mettre une directive "on error" AU MOINS dans le sub main, dans le Class_Terminate et dans CHAQUE gestionnaire d'événement, sans quoi vous avez un exécutable qui crash au moindre petit pet de travers.
Source : http://www.vb6.us/tutorials/error-handling "http://www.vb6.us/tutorials/error-handling"
La fonction de Pollux31 semble la bonne méthode pour faire ça par copier coller de partout et faire que les erreurs soient simplement loggées dans un fichier sans causer plus de dégâts. J'en ai donc fait un module standard que j'inclus dans mes projets.
###########GestionErreur.bas###########
'Module de gestion des erreurs v1.0
'Private Sub Command1_Click()
' On Error Resume Next
'
' ...
'
' If Err.Number > 0 Then Call procErrmsg(Err.Number, Err.Description)
'End Sub
Function sur_1_ligne(str As String) As String
sur_1_ligne = Replace(str, vbCrLf, "<CrLf>")
sur_1_ligne = Replace(str, vbCr, "<Cr>")
sur_1_ligne = Replace(str, vbLf, "<Lf>")
End Function
Sub procErrmsg(ByVal numErr As Integer, ByVal msgErr As String)
On Error Resume Next
Open App.Path & "\" & "errors.log" For Append As #1
Print #1, Date & " - " & Time & " - Erreur " & numErr & ": " & sur_1_ligne(msgErr)
Close #1
End Sub
#################################