Problema con el manejo de errores estándar en vba debido a bucles inexplicables
-
02-01-2020 - |
Pregunta
Estoy siguiendo instrucciones sobre cómo crear un nuevo procedimiento VBA en Access.Una de las especificaciones es utilizar el manejo estándar de errores ExitProc.Estaba un poco confundido sobre lo que eso significaba, pero miré ejemplos en línea y los ejemplos previamente completados proporcionados como plantilla, se me ocurrió esto:
On Error GoTo HandleError
'code that may cause errors
ExitProc:
Exit Function
HandleError:
If FindFolders = False Then
MsgBox ("Required folders for " & InstrumentName & " not found")
ElseIf FindFolderPaths = False Then
MsgBox ("Required folder paths for " & InstrumentName & " not found")
End If
MsgBox Err.Number & " " & Err.Description & " in FindFolderPaths"
Resume ExitProc
End Function
findfolders es una variable booleana que marqué como falsa en el procedimiento para indicar un error y FindFolderPaths es el nombre del procedimiento que estoy usando como indicación de si se encontraron las rutas.Cuando ejecuto este procedimiento aparecen los siguientes cuadros de mensajes.Creé un error en el nombre de la carpeta para mostrar cómo se manejaría el error:
-No se encontraron las carpetas requeridas para ICPMS
-0 en FindFolderPaths
-No se encontraron las carpetas requeridas para ICPMS
-20 Reanudar sin error en FindFolderPaths
Cuando repasé el procedimiento paso a paso, parece que se repite HandleError dos veces antes de ir a ExitProc y no puedo entender por qué.Además, el mensaje de error cambia durante el segundo ciclo en HandleError, lo cual es extraño.
Solución
Su problema parece ser que está "usando mal" el controlador de errores llamándolo directamente en su código usando Goto HandleError
en lugar de que se llame automáticamente cuando se produce un error.
Esto explicaría exactamente lo que reportó cuando se ejecutó su código:
-Required folders for ICPMS not found 'shows regardless of what triggers the handler
-0 in FindFolderPaths 'err number of zero means there's no error
Resume Exit Proc
luego desencadena un actual error, llamando al código por segunda vez
-Required folders for ICPMS not found 'not relevant here...
-20 Resume without Error in FindFolderPaths 'an actual error number and message
Normalmente, si hay alguna condición que pueda probar (como una carpeta faltante), entonces no necesita manejar eso llamando a un controlador de errores; puede mostrar un mensaje de su código "normal" y luego simplemente Exit function
.Alternativamente, genere un error personalizado usando Err.Raise
, dándole un número de error específico y una descripción que puede probar y manejar adecuadamente en su Controlador de errores.
http://msdn.microsoft.com/en-us/library/office/aa164019(v=office.10).aspx#odc_tentipsvba_topic3
Otros consejos
Eliminar Reanudar ExitProc.El código dejará la función cuando golpea la función final.Además, debe eliminar los paréntesis cuando llame a MsgBox.Solo use paréntesis cuando esté configurando algo igual a MSGBOX.