Compartir a través de


Información general sobre el control no estructurado de excepciones (Visual Basic)

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 crea una bifurcación en el 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 crea una bifurcación en el 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, vea 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 crea una bifurcación en la etiqueta o en el 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 Exit Sub 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. A partir de ese momento, la ejecución continúa. 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 se 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 Error (Visual Basic)

Referencia

End (Instrucción)

Err

Exit (Instrucción, Visual Basic)

Instrucción On Error (Visual Basic)

Resume (Instrucción)

Conceptos

Objeto Err en el control no estructurado de excepciones (Visual Basic)

Introducción al control de excepciones (Visual Basic)

Tipos de errores (Visual Basic)

Elegir cuándo se debe utilizar el control estructurado de excepciones y cuándo el control no estructurado de excepciones (Visual Basic)