La respuesta corta es: No, no sólo no se necesidad que tiene un controlador de errores en cada procedimiento, pero, de hecho, generalmente no quiere un controlador de errores en cada procedimiento.
Querrá hacer el manejo de errores donde tenga más sentido hacerlo. A menudo, solo querría un controlador de errores en el procedimiento de nivel más alto, es decir, el que llama a todos los demás; los procedimientos de nivel inferior deberían poner el problema en el piso de arriba y dejar que los errores "burbujeen" hasta el procedimiento de nivel superior. Algunas veces querrá algún tipo de manejo de errores en procedimientos de bajo nivel.
Para más, le remito a estos dos excelentes respuestas por @jtolle:
Además, una búsqueda en Internet revela que hay toda una literatura sobre la web sobre el manejo de errores. ¡Algo de eso está bastante mal, en mi opinión! Pero si se apega a lo que escribí en los primeros dos párrafos, vale la pena considerarlo.
Exit Sub
y End Sub
son bastante intuitivos: el anterior detiene la ejecución del Sub actual y devuelve el control al procedimiento que lo llamó (o detiene la ejecución por completo si el procedimiento no fue llamado por otro procedimiento). Este último es solo una indicación para el compilador de que aquí el código para este Sub particular termina - y si se ejecuta, End Sub
se comporta como Exit Sub
.
Resume
especifica lo que debe suceder a continuación, una vez que finaliza una rutina de manejo de errores. Plain Resume
regresa a la misma declaración que causó el error e intenta ejecutarlo de nuevo. Resume Next
omite la instrucción que provocó el error y, en su lugar, va a la instrucción inmediatamente siguiente. Resume mylabel
va a la etiqueta mylabel:
.
Si una etiqueta como su ProcError:
se encuentra en curso de ejecución, entonces no ocurre nada especial, y la ejecución pasa a la siguiente instrucción después de la etiqueta. Por supuesto, en su ejemplo, ProcError:
nunca se ejecutará directamente (es decir, no a menos que se genere un error) porque hay un Exit Sub
justo antes.
Por cierto, el bloque ProcExit:
probablemente debería comenzar con una On Error Resume Next
(es decir, seguir cerrando todo y salir sin tener en cuenta los errores) o, alternativamente, como ha señalado @Phydaux, un On Error Goto 0
(en caso de error, se detiene ejecución), de lo contrario, si algo allí desencadena un error, puede entrar en un bucle infinito de ping-pong entre el controlador de errores y el código ProcExit:
.
ProcExit:
On Error Resume Next ' or, alternatively, On Error Goto 0
Connection.Close
Connection = Nothing
Close File
SomePreciousResource.Release
Exit Sub
Dijiste que se ignorará el bloque de etiquetas, pero ¿cómo reconoce el bloque y lo separa con el resto del código? – lamwaiman1988
@ gunbuster363: Creo que la afirmación de @cmmi es más o menos correcta, aunque no muy clara. Lo que significa "se ignorará la etiqueta" es esto: la etiqueta en sí no hace nada cuando se ejecuta. Sin embargo, el código que sigue a la etiqueta (lo que usted llama el "bloque de etiquetas") no se ignorará y se ejecutará. –
Creo que lo tengo ahora. – lamwaiman1988