On Error (Instrucción)

Visual Basic VBLR

On Error (Instrucción)

       

Activa una rutina de control de errores y especifica la ubicación de la misma en un procedimiento; también puede utilizarse para desactivar una rutina de control de errores.

Sintaxis

On Error GoTo línea

On Error Resume Next

On Error GoTo 0

La sintaxis de la instrucción On Error puede tener cualquiera de los formatos siguientes:

Instrucción Descripción
On Error GoTo línea Activa la rutina de control de errores que comienza en la línea especificada en el argumento necesario línea. El argumento línea es cualquier etiqueta de línea o número de línea. Si se produce un error en tiempo de ejecución, el control pasa a línea, activando el controlador de errores. La línea especificada en el argumento línea debe encontrarse en el mismo procedimiento que la instrucción On Error; o de lo contrario, se producirá un error en tiempo de compilación.
On Error Resume Next Especifica que, en caso de que se produzca un error en tiempo de ejecución, el control pase a la instrucción que sigue inmediatamente a aquélla en la que se ha producido el error, donde continúa la ejecución. Se recomienda utilizar este formato en lugar de On Error GoTo cuando acceda a objetos.
On Error GoTo 0 Desactiva cualquier controlador de errores del procedimiento actual.

Comentarios

Si no utiliza una instrucción On Error, cualquier error en tiempo de ejecución que se produzca será fatal; es decir, aparecerá un mensaje de error y la ejecución se detendrá.

Un controlador de errores "activado" es aquél que se ha habilitado mediante una instrucción On Error y un controlador de errores “activo" es un controlador activado que se encuentra en el proceso de tratar un error. Si se produce un error mientras un controlador está activo (entre la aparición del error y una instrucción Resume, Exit Sub, Exit Function o Exit Property), el controlador de errores del procedimiento actual no puede tratarlo. El control vuelve al procedimiento que hace la llamada, y si éste cuenta con un controlador de errores activado, se utiliza ese controlador para tratar el error. Si también está activo el controlador de error del procedimiento que hace la llamada, el control vuelve hacia los procedimientos llamadores anteriores hasta llegar a un controlador de error activado, pero no activo. Si no se encuentra un controlador de errores activado e inactivo, el error es fatal en el punto en el que se produjo. Cada vez que el controlador de errores devuelve el control al procedimiento que hace la llamada, éste se convierte en el procedimiento actual. Una vez tratado un error con un controlador en cualquier procedimiento, la ejecución continúa en el procedimiento actual en el punto designado por la instrucción Resume.

Nota   Una rutina de control de errores no es un procedimiento Sub ni Function. Es una sección de código marcada con una etiqueta o un número de línea.

Las rutinas de control de errores se basan en el valor de la propiedad Number del objeto Err para determinar la causa del error. Una rutina de control de errores debe comprobar y guardar los valores de las propiedades del objeto Err antes de que pueda producirse otro error o antes de que se llame a un procedimiento que pueda causarlo. Los valores de las propiedades del objeto Err reflejan solamente el error más reciente. El mensaje de error asociado a Err.Number se encuentra en Err.Description.

On Error Resume Next hace que la ejecución continúe en la instrucción que sigue inmediatamente a la que causó el error en tiempo de ejecución, o en la que sigue inmediatamente a la última llamada desde el procedimiento que contiene la instrucción On Error Resume Next. Esta instrucción permite continuar la ejecución a pesar de que se haya producido un error en tiempo de ejecución.. Puede colocar la rutina de control de errores donde se produciría el error, en vez de transferir el control a otra posición dentro del procedimiento. La instrucción On Error Resume Next pasa a estar inactiva cuando se llama a otro procedimiento, por tanto usted debe ejecutar una instrucción On Error Resume Next en cada rutina que llamada si desea un control de errores integrado dentro de la propia rutina.

Nota   La construcción On Error Resume Next puede ser preferible a On Error GoTo cuando se traten errores generados durante el acceso a otros objetos. Comprobar Err después de cada interacción con un objeto elimina la ambigüedad en cuanto a qué objeto estaba accediendo el código cuando se produjo el error. De este modo puede saber qué objeto ha colocado el código de error en Err.Number, así como qué objeto generó originalmente el error (el objeto especificado en Err.Source).

On Error GoTo 0 desactiva el control de errores en el procedimiento actual. No especifica la línea 0 como el inicio del código de control de errores, ni siquiera cuando el procedimiento contiene una línea con el número 0. Sin una instrucción On Error GoTo 0, el control de errores se desactiva automáticamente al salir del procedimiento.

Para evitar que el código de control de errores se ejecute cuando no se ha producido ningún error, coloque una instrucción Exit Sub, Exit Function o Exit Property inmediatamente antes de la rutina de control de errores, como en el ejemplo siguiente:

Sub InicializarMatriz(Var1, Var2, Var3, Var4)
    On Error GoTo ControlErrores
    . . .
    Exit Sub
ControlErrores:
    . . .
    Resume Next
End Sub

Aquí, el código de control de errores viene a continuación de la instrucción Exit Sub y precede a End Sub para separarlo del flujo normal del procedimiento. El código de control de errores puede situarse en cualquier lugar del procedimiento.

Los errores no interceptados en los objetos se devuelven a la aplicación que los controla cuando el objeto está trabajando como un archivo ejecutable. En el entorno de desarrollo, estos errores sólo se devuelven a la aplicación si se establecen las opciones adecuadas. Consulte la documentación de su aplicación host para una descripción de las opciones que deben establecerse durante la depuración, cómo establecerlas y si el host puede crear clases.

Si crea un objeto que accede a otros objetos, deberá intentar tratar los errores que tales objetos devuelvan sin procesar. Si no puede tratarlos, copie el código de error en Err.Number en uno de sus propios errores y luego páselos al elemento que llamó a su objeto. Debe especificar el error agregando su propio código de error a la constante vbObjectError. Por ejemplo, si su código de error es 1052, asígnelo de esta forma:

Err.Number = vbObjectError + 1052

Nota   Los errores del sistema al realizar llamadas a bibliotecas de vínculos dinámicos (DLL) o recursos de código de Macintosh no generan excepciones y no se pueden tratar con el control de errores de Visual Basic. Al llamar a funciones DLL, debe comprobar en los valores devueltos si la función ha tenido éxito o ha fracasado (según las especificaciones de la API) y, en el caso de un fallo, comprobar el valor de la propiedad LastDLLError del objeto Err. LastDLLError siempre devuelve cero en Macintosh.