Instrucción On Error (Visual Basic)

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. La instrucción On Error se usa en el control no estructurado de errores y se puede usar en lugar del control de excepciones estructurado. El control estructurado de excepciones está integrado en .NET, generalmente es más eficaz y, por tanto, se recomienda al controlar errores en tiempo de ejecución en la aplicación.

Sin el control de errores o el control de excepciones, cualquier error en tiempo de ejecución que se produzca es irrecuperable: se muestra un mensaje de error y la ejecución se detiene.

Nota

La palabra clave Error también se usa en la instrucción Error, que es compatible con versiones anteriores.

Sintaxis

On Error { GoTo [ line | 0 | -1 ] | Resume Next }

Partes

Término Definición
línea GoTo Habilita la rutina de control de errores que comienza en la línea especificada en el argumento line requerido. El argumento line es cualquier etiqueta de línea o número de línea. Si se produce un error en tiempo de ejecución, el control se bifurca en la línea especificada y esto hace que el controlador de errores se active. La línea especificada debe estar en el mismo procedimiento que la instrucción On Error o se producirá un error en tiempo de compilación.
GoTo 0 Deshabilita el controlador de errores habilitado en el procedimiento actual y lo restablece en Nothing.
GoTo -1 Deshabilita la excepción habilitada en el procedimiento actual y la restablece en Nothing.
Resume Next Especifica que cuando se produce un error en tiempo de ejecución, el control va a la instrucción inmediatamente después de la instrucción donde se produjo el error y la ejecución continúa desde ese punto. Use esta forma en lugar de On Error GoTo al acceder a objetos.

Comentarios

Nota

Se recomienda usar el control estructurado de excepciones en el código siempre que sea posible, en lugar de usar el control de excepciones no estructurado y la instrucción On Error. Para obtener más información, vea Instrucción Try...Catch...Finally (Visual Basic).

Un controlador de errores "habilitado" es un controlador que está activado por una instrucción On Error. Un controlador de errores "activo" es un controlador habilitado que se encuentra en el proceso de controlar un error.

Si se produce un error mientras un controlador de errores 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 controlar el error. El control vuelve al procedimiento de llamada.

Si el procedimiento de llamada tiene un controlador de errores habilitado, se activa para controlar el error. Si el controlador de errores del procedimiento de llamada también está activo, el control pasa a través de procedimientos de llamada anteriores hasta que se encuentra un controlador de errores habilitado, pero inactivo. Si no se encuentra ningún controlador de errores de este tipo, el error es irrecuperable en el punto en que se produjo realmente.

Cada vez que el controlador de errores pasa el control de nuevo a un procedimiento de llamada, ese procedimiento se convierte en el procedimiento actual. Una vez que un controlador de errores controla 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 un procedimiento Sub ni un procedimiento Function. Es una sección de código marcada por una etiqueta de línea o un número de línea.

Propiedad Number

Las rutinas de control de errores se basan en el valor de la propiedad Number del objeto Err para determinar la causa del error. La rutina debe probar o guardar los valores de propiedad pertinentes en el objeto Err antes de que se pueda producir cualquier otro error o antes de que se llame a un procedimiento que pueda provocar un error. Los valores de propiedad del objeto Err reflejan solo el error más reciente. El mensaje de error asociado a Err.Number está incluido en Err.Description.

Throw (Instrucción)

Un error que se genera con el método Err.Raise establece la propiedad Exception en una instancia recién creada de la clase Exception. Para admitir la generación de excepciones de tipos de excepciones derivadas, se admite una instrucción Throw en el lenguaje. Esto toma un único parámetro que es la instancia de excepción que se va a iniciar. En el ejemplo siguiente se muestra cómo se pueden usar estas características con la compatibilidad con el control de excepciones existente:

    On Error GoTo Handler
    Throw New DivideByZeroException()
Handler:
    If (TypeOf Err.GetException() Is DivideByZeroException) Then
    ' Code for handling the error is entered here.
    End If

Observe que la instrucción On Error GoTo captura todos los errores, independientemente de la clase de excepción.

On Error Resume Next

On Error Resume Next hace que la ejecución continúe con la instrucción inmediatamente después de la instrucción que provocó el error en tiempo de ejecución o con la instrucción inmediatamente después de 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á 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, por lo que debe ejecutar una instrucción On Error Resume Next en cada rutina llamada si quiere controlar errores insertados dentro de esa rutina.

Nota

La construcción On Error Resume Next puede ser preferible a On Error GoTo cuando se controlan los errores generados durante el acceso a otros objetos. Si comprueba Err después de cada interacción con un objeto, eliminará la ambigüedad sobre el objeto al que ha accedido el código. Se asegurará de qué objeto colocó el código de error en Err.Number, así como el objeto que generó originalmente el error (el objeto especificado en Err.Source).

On Error GoTo 0

On Error GoTo 0 deshabilita el control de errores en el procedimiento actual. No especifica la línea 0 como inicio del código de control de errores, incluso si el procedimiento contiene una línea numerada 0. Sin una instrucción On Error GoTo 0, un controlador de errores se deshabilita automáticamente cuando se cierra un procedimiento.

On Error GoTo -1

On Error GoTo -1 deshabilita la excepción en el procedimiento actual. No especifica la línea -1 como inicio del código de control de errores, incluso si el procedimiento contiene una línea numerada -1. Sin una instrucción On Error GoTo -1, una excepción se deshabilita automáticamente cuando se cierra un procedimiento.

Para evitar que el código de control de errores se ejecute cuando no se haya 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 fragmento siguiente:

Public Sub InitializeMatrix(ByVal Var1 As Object, ByVal Var2 As Object)
   On Error GoTo ErrorHandler
   ' Insert code that might generate an error here
   Exit Sub
ErrorHandler:
   ' Insert code to handle the error here
   Resume Next
End Sub

En este caso, el código de control de errores sigue a la instrucción Exit Sub y precede a la instrucción End Sub para separarla del flujo del procedimiento. Puede colocar código de control de errores en cualquier parte de un procedimiento.

Errores sin capturar

Los errores sin capturar en los objetos se devuelven a la aplicación de control cuando el objeto se ejecuta como un archivo ejecutable. En el entorno de desarrollo, los errores sin capturar se devuelven a la aplicación de control solo si se establecen las opciones adecuadas. Consulte la documentación de la aplicación host para obtener una descripción de las opciones que se deben establecer durante la depuración, cómo establecerlas y si el host puede crear clases.

Si crea un objeto que tiene acceso a otros objetos, debe intentar gestionar los errores no controlados que devuelvan. Si no puede, asigne los códigos de error de Err.Number a uno de sus propios errores y devuélvalos al autor de la llamada del objeto. Debe especificar el error agregando el código de error a la constante VbObjectError. Por ejemplo, si el código de error es 1052, asígnelo de la siguiente manera:

Err.Number = vbObjectError + 1052

Precaución

Los errores del sistema durante las llamadas a bibliotecas de vínculos dinámicos (DLL) de Windows no generan excepciones y no se pueden capturar con la captura de errores de Visual Basic. Al llamar a las funciones DLL, debe comprobar el éxito o error de cada valor devuelto (según las especificaciones de la API) y, en caso de error, comprobar el valor de la propiedad LastDLLErrordel objeto Err.

Ejemplo

En este ejemplo se usa primero 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 dividir por cero genera el número de error 6. El error se controla en la rutina de control de errores y, posteriormente, se devuelve el control a la instrucción que provocó el error. La instrucción On Error GoTo 0 desactiva la captura de errores. Posteriormente, la instrucción On Error Resume Next se usa para aplazar la captura de errores para que el contexto del error generado por la instrucción siguiente se pueda conocer con certeza. Tenga en cuenta que Err.Clear se usa para borrar las propiedades del objeto Err después de controlar el error.

Public Sub OnErrorDemo()
   On Error GoTo ErrorHandler   ' Enable error-handling routine.
   Dim x As Integer = 32
   Dim y As Integer = 0
   Dim z As Integer
   z = x / y   ' Creates a divide by zero error
   On Error GoTo 0   ' Turn off error trapping.
   On Error Resume Next   ' Defer error trapping.
   z = x / y   ' Creates a divide by zero error again
   If Err.Number = 6 Then
      ' Tell user what happened. Then clear the Err object.
      Dim Msg As String
      Msg = "There was an error attempting to divide by zero!"
      MsgBox(Msg, , "Divide by zero error")
      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 6   ' Divide by zero error
         MsgBox("You attempted to divide by zero!")
         ' Insert code to handle this error
      Case Else
         ' Insert code to handle other situations here...
   End Select
   Resume Next  ' Resume execution at the statement immediately 
                ' following the statement where the error occurred.
End Sub

Requisitos

Espacio de nombres: Microsoft.VisualBasic

Ensamblado: Biblioteca en tiempo de ejecución de Visual Basic (en Microsoft.VisualBasic.dll)

Consulte también