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 se usa en el control de errores no estructurado y se puede usar en lugar del On Error control de excepciones estructurado. El control estructurado de excepciones está integrado en .NET, por lo general es más eficaz, por lo que se recomienda al controlar errores en tiempo de ejecución en la aplicación.
Sin control de errores ni control de excepciones, los errores en tiempo de ejecución que se produzcan son irreales: se muestra un mensaje de error y se detiene la ejecución.
Nota
La Error palabra clave también se usa en la instrucción Error, que se admite por compatibilidad con versiones anteriores.
Sintaxis
On Error { GoTo [ line | 0 | -1 ] | Resume Next }
Partes
| Término | Definición |
|---|---|
GoTolínea |
Habilita la rutina de control de errores que comienza en la línea especificada en el argumento de línea necesario. El argumento de 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 se bifurca a la línea especificada, lo que activa el controlador de errores. La línea especificada debe estar en el mismo procedimiento que la On Error instrucción 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 este formulario en lugar de On Error GoTo al obtener acceso 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 On Error instrucción . Para obtener más información, vea Instrucción Try...Catch...Finally (Visual Basic).
Un controlador de errores "habilitado" es el que se activa mediante una On Error instrucción . Un controlador de errores "activo" es un controlador habilitado que está en 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 , , o ), el controlador de errores del procedimiento actual no puede controlar Resume Exit Sub el Exit Function Exit Property 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 vuelve a pasar a través de los procedimientos de llamada anteriores hasta que se encuentra un controlador de errores habilitado, pero inactivo. Si no se encuentra este controlador de errores, el error es grave en el punto en el 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. 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 Resume instrucción .
Nota
Una rutina de control de errores no es Sub un procedimiento ni un Function procedimiento. 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 del objeto para Number determinar la causa del Err error. La rutina debe probar o guardar los valores de propiedad pertinentes en el objeto antes de que se pueda producir cualquier otro error o antes de que se llame a un procedimiento que Err podría provocar un error. Los valores de propiedad del Err objeto reflejan solo el error más reciente. El mensaje de error asociado Err.Number a está contenido en Err.Description .
Throw (Instrucción)
Un error que se produce con el Err.Raise método establece la propiedad en una instancia recién creada de la clase Exception Exception . Para admitir la generación de excepciones de tipos de excepción derivados, Throw se admite una instrucción en el lenguaje . Esto toma un único parámetro que es la instancia de excepción que se va a lanzar. En el ejemplo siguiente se muestra cómo se pueden usar estas características con la compatibilidad existente con el control de excepciones:
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 On Error GoTo instrucción captura todos los errores, independientemente de la clase de excepción.
Al reanudar el error siguiente
On Error Resume Next hace que la ejecución continúe con la instrucción inmediatamente después de la instrucción que produjo 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 On Error Resume Next instrucción . 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 se vuelve inactiva cuando se llama a otro procedimiento, por lo que debe ejecutar una instrucción en cada rutina llamada si desea controlar los errores en línea On Error Resume Next On Error Resume Next dentro de esa rutina.
Nota
La On Error Resume Next construcción puede ser preferible a al controlar los errores On Error GoTo generados durante el acceso a otros objetos. La comprobación después de cada interacción con un objeto elimina Err la ambigüedad sobre a qué objeto se ha accedido mediante el código. Puede estar seguro de qué objeto colocó el código de error en , así como de qué objeto Err.Number generó originalmente el error (el objeto especificado en Err.Source ).
En caso de error, vaya a 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 como 0. Sin una On Error GoTo 0 instrucción , un controlador de errores se deshabilita automáticamente cuando se cierra un procedimiento.
En caso de error, ir a -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 On Error GoTo -1 instrucción , 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 ha producido ningún error, coloque una instrucción , o inmediatamente antes de la rutina de control de errores, como en Exit Sub Exit Function el fragmento Exit Property 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 la instrucción y precede a la instrucción para Exit Sub End Sub separarla del flujo de procedimiento. Puede colocar código de control de errores en cualquier lugar de un procedimiento.
Errores no detectados
Los errores sin recortar en 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 no controlados 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 controlar los errores no controladas que se pasan. Si no puede, asigne los códigos de error a uno de sus propios errores y, a continuación, vuelva a pasarlos al Err.Number autor de la llamada del objeto. Debe especificar el error agregando el código de error a la VbObjectError constante. Por ejemplo, si el código de error es 1052, asígnelo como se muestra a continuación:
Err.Number = vbObjectError + 1052
Precaución
Los errores del sistema durante las llamadas Windows bibliotecas de vínculos dinámicos (DLL) no producen excepciones y no se pueden encontrar con Visual Basic captura de errores. Al llamar a funciones DLL, debe comprobar si cada valor devuelto es correcto o no (según las especificaciones de la API) y, en caso de error, comprobar el valor de la propiedad Err del LastDLLError objeto.
Ejemplo
En este ejemplo se usa primero la instrucción para especificar la ubicación de una rutina de On Error GoTo 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, a continuación, se devuelve el control a la instrucción que produjo el error. La On Error GoTo 0 instrucción desactiva la captura de errores. A continuación, la instrucción se usa para aplazar la captura de errores para que el contexto del error generado por la instrucción siguiente se pueda On Error Resume Next conocer con certeza. Tenga en Err.Clear cuenta que se usa para borrar las propiedades del objeto después de controlar el Err 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 Visual Basic runtime (en Microsoft.VisualBasic.dll)