Pregunta

Tengo una aplicación VB6, quiero ponerle alguna buena función de manejo de errores que pueda decirme cuál fue el error y el lugar exacto en el que ocurrió. ¿Alguien puede sugerir una buena manera de hacerlo?

¿Fue útil?

Solución

EN ERROR IR A

y el

Err

objeto.

hay un tutorial aquí.

Otros consejos

Primero que nada, ve a buscar MZTools para Visual Basic 6, es gratis e invaluable.En segundo lugar, agregue un controlador de errores personalizado en cada función (sí, cada función).El controlador de errores que utilizamos se parece a esto:

On Error GoTo {PROCEDURE_NAME}_Error

{PROCEDURE_BODY}

    On Error GoTo 0
    Exit {PROCEDURE_TYPE}

{PROCEDURE_NAME}_Error:

   LogError "Error " & Err.Number & " (" & Err.Description & ") in line " & Erl & _
            ", in procedure {PROCEDURE_NAME} of {MODULE_TYPE} {MODULE_NAME}"

Luego cree una función LogError que registre el error en el disco.A continuación, antes de publicar el código, agregue números de línea a cada función (esto también está integrado en MZTools).A partir de ahora sabrás por los Registros de errores todo lo que sucede.Si es posible, cargue también los registros de errores y examínelos en vivo desde el campo.

Esto es lo mejor que puede hacer para el manejo de errores globales inesperados en VB6 (uno de sus muchos defectos), y en realidad esto sólo debería usarse para encontrar errores inesperados.Si sabe que existe la posibilidad de que ocurra un error en una situación determinada, debe detectar ese error en particular y solucionarlo.Si sabe que un error que ocurre en una determinada sección causará inestabilidad (E/S de archivos, problemas de memoria, etc.), advierta al usuario y sepa que se encuentra en un "estado desconocido" y que probablemente sucederán "cosas malas".Evidentemente utilice términos amigables para mantener al usuario informado, pero no asustado.

una forma sencilla sin módulos adicionales, útil para módulos de clase:

adelantarse a cada función/subs:

On Error Goto Handler

manejador/burbuja:

Handler:
  Err.Raise Err.Number, "(function_name)->" & Err.source, Err.Description

Voila, rastro de pila de gueto.

Yo uso uno de cosecha propia Error.bas módulo para hacer que informar y volver a aumentar sea menos engorroso.

Aquí está su contenido (editado para mayor extensión):

Option Explicit

Public Sub ReportFrom(Source As Variant, Optional Procedure As String)
    If Err.Number Then
        'Backup Error Contents'
        Dim ErrNumber As Long: ErrNumber = Err.Number
        Dim ErrSource As String: ErrSource = Err.Source
        Dim ErrDescription As String: ErrDescription = Err.Description
        Dim ErrHelpFile As String: ErrHelpFile = Err.HelpFile
        Dim ErrHelpContext As Long: ErrHelpContext = Err.HelpContext
        Dim ErrLastDllError As Long: ErrLastDllError = Err.LastDllError
    On Error Resume Next
        'Retrieve Source Name'
        Dim SourceName As String
        If VarType(Source) = vbObject Then
            SourceName = TypeName(Source)
        Else
            SourceName = CStr(Source)
        End If
        If LenB(Procedure) Then
            SourceName = SourceName & "." & Procedure
        End If
        Err.Clear
        'Do your normal error reporting including logging, etc'
        MsgBox "Error " & CStr(ErrNumber) & vbLf & "Source: " & ErrSource & vbCrLf & "Procedure: " & SourceName & vbLf & "Description: " & ErrDescription & vbLf & "Last DLL Error: " & Hex$(ErrLastDllError)
        'Report failure in logging'
        If Err.Number Then
            MsgBox "Additionally, the error failed to be logged properly"
            Err.Clear
        End If
    End If
End Sub

Public Sub Reraise(Optional ByVal NewSource As String)
    If LenB(NewSource) Then
        NewSource = NewSource & " -> " & Err.Source
    Else
        NewSource = Err.Source
    End If
    Err.Raise Err.Number, NewSource, Err.Description, Err.HelpFile, Err.HelpContext
End Sub

Informar un error es tan simple como:

Public Sub Form_Load()
On Error Goto HError
    MsgBox 1/0
    Exit Sub
HError:
    Error.ReportFrom Me, "Form_Load"
End Sub

Volver a generar un error es tan simple como llamar Error.Reraise con la nueva fuente.

Aunque es posible recuperar el Source y Procedure parámetros de la pila de llamadas si compila con información de depuración simbólica, no es lo suficientemente confiable para usarlo en aplicaciones de producción

Sí, siga el consejo de Kris y obtenga MZTools.

Puede agregar números de línea para separar áreas de procedimientos complejos, que ERL informará en el controlador de errores, para rastrear qué área está causando el error.

10
    ...group of statements
20
    ...group of statements
30
    ...and so on

Usar en

dim errhndl as string
on error goto errhndl
errhndl:
msgbox "Error"

Utilice la declaración On Error y el objeto Err.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top