Gestión de errores en todo el programa VB6

Resuelto
Usuario anónimo -  
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!

8 respuestas

  1. Polux31 Mensajes publicados 7219 Estado Miembro 1 204
     
    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
    2
    1. Usuario anónimo
       
      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?
      0
  2. gg2laba
     
    "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.
    1
  3. choubaka Mensajes publicados 5534 Fecha de registro   Estado Moderador Última intervención   2 113
     
    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 ..
    0
    1. Usuario anónimo
       
      gracias,
      entonces no me queda muy claro...
      ¿puedes ponerme un ejemplo de código para el procedimiento público? ¿Y puedo obtener la sub que llama al procedimiento? ¿Y tengo que escribir call nombre_del_procedimiento o qué?
      0
  4. Polux31 Mensajes publicados 7219 Estado Miembro 1 204
     
    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
    0
    1. Usuario anónimo
       
      Entonces de acuerdo, podría usar On Error Resume Next, pero ¿debo escribirlo al inicio de cada una de mis funciones?
      0
  5. Polux31 Mensajes publicados 7219 Estado Miembro 1 204
     
    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
    0
    1. Usuario anónimo
       
      Gracias, ¡otro problema resuelto gracias a ti!
      0
  6. Polux31 Mensajes publicados 7219 Estado Miembro 1 204
     
    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
    0
  7. gg2laba
     
    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.
    0
    1. Polux31 Mensajes publicados 7219 Estado Miembro 1 204
       
      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
      0
      1. gg2laba > Polux31 Mensajes publicados 7219 Estado Miembro
         
        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!
        0
      2. Polux31 Mensajes publicados 7219 Estado Miembro 1 204 > gg2laba
         
        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
        0
  8. Derdonn Mensajes publicados 15 Estado Miembro
     
    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
    #################################
    0