number example error err vb6 error-handling

example - ¿Cuál es la mejor manera de manejar los errores en VB6?



on error goto vba excel (7)

Tengo la aplicación VB6, quiero poner un buen error en el manejo de la detección que pueda decirme cuál fue el error y el lugar exacto cuando ocurrió, ¿alguien puede sugerir la buena manera de hacerlo?


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

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 crea una función LogError que registra el error en el disco. A continuación, antes de liberar 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á de los registros de errores todo lo que sucede. Si es posible, también cargue los registros de errores y examínelos en vivo desde el campo.

Esto es lo mejor que puede hacer para el manejo inesperado de errores globales en VB6 (uno de sus muchos defectos), y realmente esto solo debería usarse para encontrar errores inesperados. Si sabe que existe la posibilidad de que se produzca un error en una determinada situación, debería detectar ese error en particular y manejarlo. Si sabe que un error que ocurre en una determinada sección va a causar inestabilidad (Archivo I / O, Problemas de memoria, etc.), advierta al usuario y sepa que se encuentra en un "estado desconocido" y que es probable que sucedan "cosas malas". Obviamente, use términos amigables para mantener al usuario informado, pero no asustado.


Sí, toma el consejo de Kris y obtén MZTools.

Puede agregar números de línea a secciones de á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 instrucción On Error y el objeto Err.


Utilizo un módulo Error.bas cosecha Error.bas para que la Error.bas de informes y la reconstrucción sean menos engorrosas.

Aquí está su contenido (editado para la longitud):

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

Reportar 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

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

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


de una manera simple sin módulos adicionales, útil para los módulos de clase:

adelantarse a cada función / subs:

On Error Goto Handler

controlador / bubbleup:

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

voila, ghetto stack trace.


ON ERROR GOTO

y el

Err

objeto.

Hay un tutorial aquí .