Instrucción On Error
Habilita una rutina de control de errores y especifica la ubicación de la rutina dentro de un procedimiento; también se puede usar para deshabilitar una rutina de control de errores.
Sintaxis
On Error GoToline
On Error Resume Next
On Error GoTo 0
La sintaxis de instrucción On Error puede tener cualquiera de las siguientes formas:
Instrucción | Descripción |
---|---|
On Error GoToline | Habilita la rutina de control de errores que comienza en la línea especificada en el argumentode línea necesario. El argumento línea es cualquier etiqueta de línea o número de línea. Si se produce un error de tiempo de ejecución, el control se transfiere a línea, que activa el controlador de errores. La línea especificada debe estar en el mismo procedimiento que la instrucción On Error; de lo contrario, se produce el error tiempo de compilación. |
On Error Resume Next | Especifica que cuando se produce un error en tiempo de ejecución, el control se transfiere a la instrucción inmediatamente posterior a la instrucción en la que se produjo el error y la ejecución sigue su curso. Utilice este formulario en lugar de On Error Go To al acceder a los objetos. |
On Error GoTo 0 | Deshabilita cualquier controlador de errores habilitado en el procedimiento actual. |
Observaciones
Si no usa una instrucción On Error, cualquier error en tiempo de ejecución que se produzca es grave; es decir, se muestra un mensaje de error y se detiene la ejecución.
Un controlador de errores "habilitado" es el que se activa por una instrucción On Error; un controlador de errores "activo" es un controlador de errores habilitado que se encuentra en el proceso de manipular un error. Si se produce un error mientras que un controlador de errores está activo (entre la aparición del error y una instrucción Resume, Exit Sub, Exit Function, or Exit Property), el controlador de errores del procedimiento actual no puede manipular el error. El control vuelve al procedimiento de llamada.
Si el procedimiento de llamada tiene un controlador de errores habilitado, se activa para manipular el error. Si el controlador de errores del procedimiento de llamada también está activo, el control pasa de nuevo a través de los procedimientos de llamada anteriores hasta que se encuentra un controlador de errores habilitado, aunque inactivo. Si no se encuentra, el error es grave en el producto en que se produjo realmente.
Cada vez que el controlador de errores devuelve el control a un procedimiento de llamada, ese procedimiento se convierte en el procedimiento actual. Después de que un controlador de errores controle un error en cualquier procedimiento, la ejecución se reanuda en el procedimiento actual en el punto designado por la instrucción Resume.
Nota:
Una rutina de control de errores no es ni un procedimiento Sub ni uno Function. Es una sección de código marcada por una etiqueta de línea o un número de línea.
Las rutinas de control de errores se basan en el valor en la propiedad Number del objeto Err para determinar la causa del error. La rutina de control de errores debe probar o guardar los valores de propiedad relevantes en el objeto Err antes de que se pueda producir cualquier otro error o antes de que se llame a un procedimiento que pudiera causar un error. Los valores de propiedad en el objeto Err solo reflejan el error más reciente. El mensaje de error asociado con Err.Number se incluye en Err.Description.
On Error Resume Next hace que la ejecución continúe con la instrucción inmediatamente posterior a la instrucción que produjo el error en tiempo de ejecución, o con la instrucción inmediatamente posterior a la llamada más reciente del procedimiento que contiene la instrucción On Error Resume Next. Esta instrucción permite que la ejecución continúe a pesar de un error en tiempo de ejecución. Puede colocar la rutina de control de errores donde se produciría el error, en lugar de transferir el control a otra ubicación dentro del procedimiento. Una instrucción On Error Resume Next se vuelve inactiva cuando se llama a otro procedimiento, de modo que debería ejecutar una instrucción On Error Resume Next en cada rutina llamada si desea el control de errores incorporado dentro de esa rutina.
Nota:
[!NOTA] La construcción On Error Resume Next puede ser preferible a On Error GoTo al controlar errores generados durante el acceso a otros objetos. La comprobación de Err tras cada interacción con un objeto elimina la ambigüedad acerca de a qué objeto se tuvo acceso por el código. Puede asegurarse de qué objeto colocó el código de error en Err.Number, así como qué objeto generó el error inicial (el objeto especificado en Err.Source).
On Error GoTo 0 deshabilita el control de errores en el procedimiento actual. Si no especifica la línea 0 como el comienzo del código de control de errores, aunque el procedimiento contenga una línea numerada 0. Sin una instrucción On Error GoTo 0, un controlador de errores se deshabilita automáticamente cuando se sale de un procedimiento.
Para evitar que se ejecute el código de control de errores cuando no se ha producido ningún error, coloque una instrucción Exit Sub, Exit Function o Exit Property justo antes de la rutina de control de errores, como en el siguiente fragmento:
Sub InitializeMatrix(Var1, Var2, Var3, Var4)
On Error GoTo ErrorHandler
. . .
Exit Sub
ErrorHandler:
. . .
Resume Next
End Sub
Aquí, el código de control de errores sigue a la instrucción Exit Sub y precede a la instrucción End Sub para separarlo del flujo de procedimiento. El código de control de errores se puede colocar en cualquier lugar de un procedimiento.
Los errores sin capturar en objetos se devuelven a la aplicación de control cuando el objeto se está ejecutando como archivo ejecutable. Dentro del entorno de desarrollo, los errores sin capturar solo se devuelven a la aplicación de control si se establecen las opciones adecuadas. Consulte la documentación de la aplicación host para obtener una descripción de qué opciones se deben configurar durante la depuración, cómo configurarlas y si el host puede crear clases.
Si crea un objeto que tiene acceso a otros objetos, debería intentar controlar los errores no controlados procedentes de ellos. Si no puede controlar dichos errores, asigne el código de error en Err.Number a uno de sus propios errores y, a continuación, devuélvalos al autor de la llamada de su objeto. Debería especificar su error agregando su código de error a la constante vbObjectError. Por ejemplo, si su código de error es 1052, asígnelo de la siguiente manera:
Err.Number = vbObjectError + 1052
Nota:
Los errores del sistema durante las llamadas a bibliotecas de vínculos dinámicos (DLL) de Windows o a recursos de código de Macintosh no generan excepciones y no se pueden capturar con la captura de errores de Visual Basic. Al llamar a las funciones DLL, debe comprobar todos los valores devueltos para ver si tienen errores o no (según las especificaciones API) y, en el caso de que haya un error, compruebe el valor de la propiedad LastDLLError del objeto Err. LastDLLError siempre devuelve cero en Macintosh.
Ejemplo
Este ejemplo primero usa la instrucción On Error GoTo para especificar la ubicación de una rutina de control de errores dentro de un procedimiento. En el ejemplo, un intento de eliminar un archivo abierto genera el número de error 55. El error se controla en la rutina de control de errores y el control se devuelve entonces a la instrucción que ha causado el error. La instrucción On Error GoTo 0 desactiva la captura de errores.
La instrucción On Error Resume Next se usa después para deferir la captura de errores de modo que se pueda conocer de seguro el contexto del el error generado por la siguiente instrucción. Tenga en cuenta que Err.Clear se usa para borrar las propiedades del objeto Err una vez que el error está controlado.
Sub OnErrorStatementDemo()
On Error GoTo ErrorHandler ' Enable error-handling routine.
Open "TESTFILE" For Output As #1 ' Open file for output.
Kill "TESTFILE" ' Attempt to delete open
' file.
On Error Goto 0 ' Turn off error trapping.
On Error Resume Next ' Defer error trapping.
ObjectRef = GetObject("MyWord.Basic") ' Try to start nonexistent
' object, then test for
'Check for likely Automation errors.
If Err.Number = 440 Or Err.Number = 432 Then
' Tell user what happened. Then clear the Err object.
Msg = "There was an error attempting to open the Automation object!"
MsgBox Msg, , "Deferred Error Test"
Err.Clear ' Clear Err object fields
End If
Exit Sub ' Exit to avoid handler.
ErrorHandler: ' Error-handling routine.
Select Case Err.Number ' Evaluate error number.
Case 55 ' "File already open" error.
Close #1 ' Close open file.
Case Else
' Handle other situations here...
End Select
Resume ' Resume execution at same line
' that caused the error.
End Sub
Vea también
Soporte técnico y comentarios
¿Tiene preguntas o comentarios sobre VBA para Office o esta documentación? Vea Soporte técnico y comentarios sobre VBA para Office para obtener ayuda sobre las formas en las que puede recibir soporte técnico y enviar comentarios.