Información general sobre el control no estructurado de excepciones

Actualización: noviembre 2007

En el caso del control no estructurado de excepciones, se coloca una instrucción On Error al principio de un bloque de código, que controla todos los errores que se producen dentro del bloque. Cuando se genera una excepción en un procedimiento después de que se haya ejecutado la instrucción On Error, el programa salta al argumento line especificado en la instrucción On Error. El argumento line, que es cualquier etiqueta de línea o número de línea, indica la ubicación del controlador de excepción

A veces se efectúa una llamada desde el procedimiento original hasta otro procedimiento, y se produce una excepción en el procedimiento al que se llama. En estos casos, si el procedimiento al que se llama no controla la excepción, ésta se propaga de vuelta al procedimiento que realiza la llamada y la ejecución salta al argumento line.

Nota:

El método de control de errores no estructurado mediante On Error puede degradar el rendimiento de la aplicación, y dificultar la depuración y el mantenimiento del código. Se recomienda utilizar el método de control de errores estructurado. Para obtener más información, consulte Información general sobre el control estructurado de excepciones de Visual Basic.

On Error GoTo Line

La instrucción On Error GoTo Line supone que el control de errores se inicia en la línea especificada en el argumento line necesario. Si se produce un error en tiempo de ejecución, el control se transfiere a la etiqueta o al número de línea especificado en el argumento, con lo que se activa el controlador de errores*.* La línea especificada debe estar en el mismo procedimiento que la instrucción On Error GoTo Line; de lo contrario, Visual Basic genera un error del compilador. En el siguiente ejemplo se muestra el uso de un controlador de errores con una etiqueta de línea:

Sub TestSub
   On Error GoTo ErrorHandler
      ' Code that may or may not contain errors.
   Exit Sub

   ErrorHandler:
      ' Code that handles errors.
      Resume
End Sub

El ejemplo contiene un controlador de errores denominado ErrorHandler. Si el código de la subrutina TestSub genera un error, Visual Basic ejecuta de forma inmediata el código que sigue a la etiqueta ErrorHandler. Al final del bloque de control de errores, la instrucción Resume transfiere el control de nuevo a la línea de código en la que se produjo el error por primera vez. Después continúa la ejecución del resto de la subrutina como si no se hubiese producido ningún error.

Nota:

Debe colocar una instrucción ExitSub inmediatamente antes de bloque de control de errores. De lo contrario, Visual Basic ejecutará el código de control de errores cuando llegue al final de la subrutina, lo que puede provocar resultados inesperados o no deseados.

On Error Resume Next

La instrucció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 inmediatamente siguiente a aquélla en que se haya producido el error. En ese momento, continúa la ejecución. On Error Resume Next permite colocar las rutinas de control de errores en los lugares donde se prevea que pueden producirse, en lugar de transferir el control a otro punto del procedimiento.

Nota:

Si el procedimiento llama a otro procedimiento, la instrucción On Error Resume Next se vuelve inactiva durante la ejecución del procedimiento llamado. Por lo tanto, debe colocar una instrucción On Error Resume Next en cada procedimiento al que se llame que la necesite. Esto es necesario porque el comportamiento de Resume Next sólo se aplica al procedimiento que contiene la instrucción On Error Resume Next. Si se produce un error no controlado en un procedimiento al que se ha llamado, la excepción se propaga de vuelta al procedimiento que realizó la llamada, y la ejecución se reanuda en la instrucción siguiente a la del procedimiento de llamada. Es estos casos, no se controla el error.

Resume también puede utilizarse de forma independiente, fuera de la instrucción On Error. Si se utiliza Resume de esta forma, Visual Basic devuelve el control a la instrucción que provocó el error. Resume suele utilizarse después de que un controlador de errores corrija el error.

Visual Basic dispone también de la instrucción Resume Next que dirige el control a la línea inmediatamente posterior a la línea de código que provocó el error. Debería utilizar Resume Next en aquellos casos en los que un error no detenga la ejecución de la aplicación. También debería utilizarla si un error dado no cambia el resultado esperado de la subrutina.

Otra variación en la instrucción Resume es Resume Line que es similar a On Error GoTo Line. Resume Line pasa el control a una línea que especifica en el argumento line. Resume Line sólo puede utilizarse dentro de un controlador de errores.

Nota:

Al depurar el código, debe deshabilitar la instrucción On Error Resume Next.

On Error GoTo 0

La instrucción On Error GoTo 0 deshabilita cualquier controlador de errores en el procedimiento actual. Si no incluye una instrucción On Error GoTo 0, el controlador de errores se deshabilita igualmente cuando finaliza el procedimiento que contiene el controlador de excepciones.

Nota:

La instrucción On Error GoTo 0 no está designada para especificar la línea 0 en el inicio del código de control de errores, incluso aunque el procedimiento contenga una línea número 0.

On Error GoTo -1

La instrucción On Error GoTo -1 deshabilita cualquier controlador de excepciones en el procedimiento actual. Si no incluye una instrucción On Error GoTo -1, la excepción se deshabilita automáticamente cuando finaliza el procedimiento.

Nota:

La instrucción On Error GoTo -1 no está designada para especificar la línea -1 en el inicio del código de control de errores, incluso aunque el procedimiento contenga una línea número -1.

Ejemplo de control no estructurado de excepciones

En el código que se muestra a continuación, el controlador de excepciones se denomina DivideByZero y controla un error específico, el de intentar dividir un número por cero. Si se produce un error distinto, Visual Basic genera un error en tiempo de ejecución y detiene la aplicación.

Sub ErrorTest ()
' Declare variables.
   Dim x As Integer, y As Integer, z As Integer
   ' The exception handler is named "DivideByZero".
   On Error GoTo DivideByZero
   ' The main part of the code, which might cause an error.
   x = 2
   y = 0
   z = x \ y

   ' This line disables the exception handler.
   On Error GoTo 0
      Console.WriteLine(x & "/" & y & " = " & z)

   ' Exit the subroutine before the error-handling code.
   ' Failure to do so can create unexpected results.
   Exit Sub

   ' This is the exception handler, which deals with the error.
   DivideByZero:
   ' Include a friendly message to let the user know what is happening.
   Console.WriteLine("You have attempted to divide by zero!")

   ' Provide a solution to the error.
   y = 2

   ' The Resume statement returns to the point at which
   ' the error first occurred, so the application
   ' can continue to run.
   Resume

End Sub

Vea también

Tareas

Cómo: Recuperar información de un objeto de error

Conceptos

Objeto Err en el control no estructurado de excepciones

Introducción al control de excepciones

Tipos de errores

Elegir cuándo se debe utilizar el control estructurado de excepciones y cuándo el control no estructurado de excepciones

Referencia

End (Instrucción)

Err (Objeto, Visual Basic)

Instrucción Exit (Visual Basic)

Instrucción On Error (Visual Basic)

Resume (Instrucción)