Módulo de clase: clsErrorhandler
Option Compare Database
Option Explicit
'---------------------------------------------------------------------------------------------------------------------------------------------------------
' Fuente : https://access-global.net/vba-clsErrorHandler/
' Destello formativo 324
'---------------------------------------------------------------------------------------------------------------------------------------------------------
' Título : clsErrorHandler
' Autor original : Microsoft | NorthWind Traders | Developer edition
' Adaptado : Luis Viadel | luisviadel@cowtechnologies.net
' Creado : 2023
' Propósito : establecer un objeto propio de control de errores que genere un log para el programador
'---------------------------------------------------------------------------------------------------------------------------------------------------------
' Información : https://learn.microsoft.com/openspecs/microsoft_general_purpose_programming_languages/ms-vbal/189fb41b-cc3a-4999-a6d2-ba89f72d2870
' Esta es una clase estática, lo que significa que el desarrollador no necesita instanciarla, siempre está ahí.
' Para usarlo en sus propios proyectos, debe usar este procedimiento:
' Exportar archivo fuera de esta base de datos e Importar archivo a su base de datos.
' Un simple copiar/pegar el código NO es suficiente.
'
' Test: : Para adaptar este código en tu aplicación puedes basarte en este procedimiento test. Copiar el bloque siguiente al
' portapapeles y pega en el editor de VBA. Pulsa F5 para ver su funcionamiento.
'
' Sub clsErrorHandler_test()
'10 On Error GoTo Err_Handler
'
' 'Pon aquí el código que desees
'
'Exit_Handler:
'20 Exit Sub
'
'Err_Handler:
'30 clsErrorHandler.HandleError "TuModulo", "TuProcedimiento", err.number, err.description, Erl
'40 Resume Exit_Handler
'
' End Sub
'-----------------------------------------------------------------------------------------------------------------------------------------------------------
Private Const LOGFILENAME As String = "MiLogDeErrores.log"
Private m_strLogFilePath As String
Private Sub Class_Initialize()
10 On Error GoTo Err_Handler
'Crea la ruta completa al archivo de registro de errores en la misma carpeta que la base de datos actual, & _
concatenando la carpeta, una barra invertida y un nombre de archivo.
20 m_strLogFilePath = CurrentProject.Path & "" & LOGFILENAME
Exit_Handler:
30 Exit Sub
Err_Handler:
40 clsErrorHandler.HandleError "clsErrorHandler", "Class_Initialize", Err.Number, Err.Description, Erl
50 Resume Exit_Handler
End Sub
'NOTE:
' This main error handler should not itself have an error handler.
Public Sub HandleError(ByVal strModuleName As String, ByVal strProcedureName As String, ErrorNumber As Long, ErrDescription As String, Erl As Long)
Dim strMsg As String
10 If ErrorNumber = 2501 Then Exit Sub '2501 = la acción de abrir el formulario ha sido cancelada. No se trata realmente de un error.
'Registra el error, incluso antes de mostrárselo al usuario.
20 LogErrorToFile ErrDescription, ErrorNumber, Erl, strModuleName, strProcedureName
'Crea el mensaje concatenando cadenas con la información
30 strMsg = "Se ha producido el siguiente error: " & vbCrLf
40 strMsg = strMsg & ErrDescription & vbCrLf
50 If Erl <> 0 Then strMsg = strMsg & "en la linea " & Erl & vbCrLf
60 strMsg = strMsg & strModuleName & "." & strProcedureName & vbCrLf & vbCrLf
70 strMsg = strMsg & "Número de error: " & ErrorNumber & vbCrLf & vbCrLf
80 strMsg = strMsg & "Por favor, notifíquelo al administrador del sistema. Gracias."
' Muestra el mensaje al usuario. Si ejecutas ACCDB puedes presionar Ctrl+Break+Step en el depurador para acceder al procedimiento de llamada.
90 MsgBox strMsg, vbCritical
End Sub
Private Sub LogErrorToFile(ByVal strError As String, ByVal lngError As Long, ByVal lngErrorLine As Long, ByVal strModuleName As String, ByVal strProcedureName As String)
10 On Error GoTo Err_Handler
Dim intFile As Integer
20 intFile = FreeFile
30 Open m_strLogFilePath For Append As intFile
40 Print #intFile, "Fecha y hora : " & Now
50 Print #intFile, "Módulo : " & strModuleName
60 Print #intFile, "Procedimiento : " & strProcedureName
70 Print #intFile, "Descripción : " & strError
80 Print #intFile, "Número de error: " & lngError
90 Print #intFile, "Línea : " & IIf(lngErrorLine = 0, "<none>", lngErrorLine)
100 Print #intFile, "Usuario : " & Environ$("USERNAME")
110 Print #intFile, "Equipo : " & Environ$("COMPUTERNAME")
120 Print #intFile, "---------------"
130 Close #intFile
Exit_Handler:
140 Exit Sub
Err_Handler:
150 clsErrorHandler.HandleError "clsErrorHandler", "LogErrorToFile", Err.Number, Err.Description, Erl
160 Resume Exit_Handler
End Sub