Instrucción On ErrorOn Error statement

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.Enables an error-handling routine and specifies the location of the routine within a procedure; can also be used to disable an error-handling routine.

SintaxisSyntax

On Error GoTo líneaOn Error GoTo line
On Error Resume NextOn Error Resume Next
**On Error GoTo 0** **On Error GoTo 0**


La sintaxis de la instrucción On Error puede tener cualquiera de las siguientes formas:The On Error statement syntax can have any of the following forms:

InstrucciónStatement DescripciónDescription
línea On Error GoToOn Error GoTo line Habilita la rutina de control de errores que comienza en la línea especificada en el argumento línea requerido. Enables the error-handling routine that starts at line specified in the required line argument.

El argumento línea es cualquier etiqueta de línea o número de línea.The line argument is any line label or line number.

Si se produce un error de tiempo de ejecución, el control se transfiere a línea, que activa el controlador de errores.If a run-time error occurs, control branches to line, making the error handler active.

La línea especificada debe estar en el mismo procedimiento que la instrucción On Error; de lo contrario, se produce el error tiempo de compilación.The specified line must be in the same procedure as the On Error statement; otherwise, a compile-time error occurs.
On Error Resume NextOn Error Resume Next Especifica que cuando se produce un error en tiempo de ejecución, el control se transfiere a la instrucción inmediatamente posterior a la instrucción en la que se produjo el error y la ejecución sigue su curso.Specifies that when a run-time error occurs, control goes to the statement immediately following the statement where the error occurred and execution continues. Utilice este formulario en lugar de On Error Go To al acceder a los objetos.Use this form rather than On Error GoTo when accessing objects.
On Error GoTo 0On Error GoTo 0 Deshabilita cualquier controlador de errores habilitado en el procedimiento actual.Disables any enabled error handler in the current procedure.

ObservacionesRemarks

Si no usa una instrucción On Error, cualquier error en tiempo de ejecución que se produzca es grave; es decir, se muestra un mensaje de error y se detiene la ejecución.If you don't use an On Error statement, any run-time error that occurs is fatal; that is, an error message is displayed and execution stops.

Un controlador de errores "habilitado" es el que se activa por una instrucción On Error; un controlador de errores "activo" es un controlador de errores habilitado que se encuentra en el proceso de manipular un error.An "enabled" error handler is one that is turned on by an On Error statement; an "active" error handler is an enabled handler that is in the process of handling an error. Si se produce un error mientras que un controlador de errores está activo (entre la aparición del error y una instrucción Resume, Exit Sub, Exit Function, or Exit Property), el controlador de errores del procedimiento actual no puede manipular el error.If an error occurs while an error handler is active (between the occurrence of the error and a Resume, Exit Sub, Exit Function, or Exit Property statement), the current procedure's error handler can't handle the error. El control vuelve al procedimiento de llamada.Control returns to the calling procedure.

Si el procedimiento de llamada tiene un controlador de errores habilitado, se activa para manipular el error.If the calling procedure has an enabled error handler, it is activated to handle the error. Si el controlador de errores del procedimiento de llamada también está activo, el control pasa de nuevo a través de los procedimientos de llamada anteriores hasta que se encuentra un controlador de errores habilitado, aunque inactivo.If the calling procedure's error handler is also active, control passes back through previous calling procedures until an enabled, but inactive, error handler is found. Si no se encuentra, el error es grave en el producto en que se produjo realmente.If no inactive, enabled error handler is found, the error is fatal at the point at which it actually occurred.

Cada vez que el controlador de errores devuelve el control a un procedimiento de llamada, ese procedimiento se convierte en el procedimiento actual.Each time the error handler passes control back to a calling procedure, that procedure becomes the current procedure. Después de que un controlador de errores controle un error en cualquier procedimiento, la ejecución se reanuda en el procedimiento actual en el punto designado por la instrucción Resume.After an error is handled by an error handler in any procedure, execution resumes in the current procedure at the point designated by the Resume statement.

Note

Una rutina de control de errores no es ni un procedimiento Sub ni uno Function.An error-handling routine is not a Sub procedure or Function procedure. Es una sección de código marcada por una etiqueta de línea o un número de línea.It is a section of code marked by a line label or line number.

Las rutinas de control de errores se basan en el valor en la propiedad Number del objeto Err para determinar la causa del error.Error-handling routines rely on the value in the Number property of the Err object to determine the cause of the error. La rutina de control de errores debe probar o guardar los valores de propiedad relevantes en el objeto Err antes de que se pueda producir cualquier otro error o antes de que se llame a un procedimiento que pudiera causar un error.The error-handling routine should test or save relevant property values in the Err object before any other error can occur or before a procedure that might cause an error is called. Los valores de propiedad en el objeto Err solo reflejan el error más reciente.The property values in the Err object reflect only the most recent error. El mensaje de error asociado con Err.Number se incluye en Err.Description.The error message associated with Err.Number is contained in Err.Description.

On Error Resume Next hace que la ejecución continúe con la instrucción inmediatamente posterior a la instrucción que produjo el error en tiempo de ejecución, o con la instrucción inmediatamente posterior a la llamada más reciente del procedimiento que contiene la instrucción On Error Resume Next.On Error Resume Next causes execution to continue with the statement immediately following the statement that caused the run-time error, or with the statement immediately following the most recent call out of the procedure containing the On Error Resume Next statement. Esta instrucción permite que la ejecución continúe a pesar de un error en tiempo de ejecución.This statement allows execution to continue despite a run-time error. 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.You can place the error-handling routine where the error would occur, rather than transferring control to another location within the procedure. Una instrucción On Error Resume Next se vuelve inactiva cuando se llama a otro procedimiento, de modo que debería ejecutar una instrucción On Error Resume Next en cada rutina llamada si desea el control de errores incorporado dentro de esa rutina.An On Error Resume Next statement becomes inactive when another procedure is called, so you should execute an On Error Resume Next statement in each called routine if you want inline error handling within that routine.

Note

[!NOTA] La construcción On Error Resume Next puede ser preferible a On Error GoTo al controlar errores generados durante el acceso a otros objetos.The On Error Resume Next construct may be preferable to On Error GoTo when handling errors generated during access to other objects. La comprobación de Err tras cada interacción con un objeto elimina la ambigüedad acerca de a qué objeto se tuvo acceso por el código.Checking Err after each interaction with an object removes ambiguity about which object was accessed by the code. Puede asegurarse de qué objeto colocó el código de error en Err.Number, así como qué objeto generó el error inicial (el objeto especificado en Err.Source).You can be sure which object placed the error code in Err.Number, as well as which object originally generated the error (the object specified in Err.Source).

On Error GoTo 0 deshabilita el control de errores en el procedimiento actual.On Error GoTo 0 disables error handling in the current procedure. Si no especifica la línea 0 como el comienzo del código de control de errores, aunque el procedimiento contenga una línea numerada 0.It doesn't specify line 0 as the start of the error-handling code, even if the procedure contains a line numbered 0. Sin una instrucción On Error GoTo 0, un controlador de errores se deshabilita automáticamente cuando se sale de un procedimiento.Without an On Error GoTo 0 statement, an error handler is automatically disabled when a procedure is exited.

Para evitar que se ejecute el código de control de errores cuando no se ha producido ningún error, coloque una instrucción Exit Sub, Exit Function o Exit Property justo antes de la rutina de control de errores, como en el siguiente fragmento:To prevent error-handling code from running when no error has occurred, place an Exit Sub, Exit Function, or Exit Property statement immediately before the error-handling routine, as in the following fragment:

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

Aquí, el código de control de errores sigue a la instrucción Exit Sub y precede a la instrucción End Sub para separarlo del flujo de procedimiento.Here, the error-handling code follows the Exit Sub statement and precedes the End Sub statement to separate it from the procedure flow. El código de control de errores se puede colocar en cualquier lugar de un procedimiento.Error-handling code can be placed anywhere in a procedure.

Los errores sin capturar en objetos se devuelven a la aplicación de control cuando el objeto se está ejecutando como archivo ejecutable.Untrapped errors in objects are returned to the controlling application when the object is running as an executable file. Dentro del entorno de desarrollo, los errores sin capturar solo se devuelven a la aplicación de control si se establecen las opciones adecuadas.Within the development environment, untrapped errors are only returned to the controlling application if the proper options are set. Consulte la documentación de la aplicación host para obtener una descripción de qué opciones se deben configurar durante la depuración, cómo configurarlas y si el host puede crear clases.See your host application's documentation for a description of which options should be set during debugging, how to set them, and whether the host can create classes.

Si crea un objeto que tiene acceso a otros objetos, debería intentar controlar los errores no controlados procedentes de ellos.If you create an object that accesses other objects, you should try to handle errors passed back from them unhandled. Si no puede controlar dichos errores, asigne el código de error en Err.Number a uno de sus propios errores y, a continuación, devuélvalos al autor de la llamada de su objeto.If you cannot handle such errors, map the error code in Err.Number to one of your own errors, and then pass them back to the caller of your object. Debería especificar su error agregando su código de error a la constante vbObjectError.You should specify your error by adding your error code to the vbObjectError constant. Por ejemplo, si su código de error es 1052, asígnelo de la siguiente manera:For example, if your error code is 1052, assign it as follows:

Err.Number = vbObjectError + 1052 

Note

Los errores de sistema durante las llamadas a las bibliotecas de vínculos dinámicos (DLL) de Windows o los recursos de código de Macintosh no generan excepciones y no se pueden capturar con la captura de errores de Visual Basic.System errors during calls to Windows dynamic-link libraries (DLL) or Macintosh code resources do not raise exceptions and cannot be trapped with Visual Basic error trapping. Al llamar a las funciones DLL, debe comprobar todos los valores devueltos para ver si tienen errores o no (según las especificaciones API) y, en el caso de que haya un error, compruebe el valor de la propiedad LastDLLError del objeto Err. When calling DLL functions, you should check each return value for success or failure (according to the API specifications), and in the event of a failure, check the value in the Err object's LastDLLError property. LastDLLError siempre devuelve cero en Macintosh.LastDLLError always returns zero on the Macintosh.

EjemploExample

Este ejemplo primero usa la instrucción On Error GoTo para especificar la ubicación de una rutina de control de errores dentro de un procedimiento.This example first uses the On Error GoTo statement to specify the location of an error-handling routine within a procedure. En el ejemplo, un intento de eliminar un archivo abierto genera el número de error 55.In the example, an attempt to delete an open file generates error number 55. El error se controla en la rutina de control de errores y el control se devuelve entonces a la instrucción que ha causado el error.The error is handled in the error-handling routine, and control is then returned to the statement that caused the error. La instrucción On Error GoTo 0 desactiva la captura de errores.The On Error GoTo 0 statement turns off error trapping.

La instrucción On Error Resume Next se usa después para deferir la captura de errores de modo que se pueda conocer de seguro el contexto del el error generado por la siguiente instrucción.The On Error Resume Next statement is then used to defer error trapping so that the context for the error generated by the next statement can be known for certain. Tenga en cuenta que Err.Clear se usa para borrar las propiedades del objeto Err una vez que el error está controlado.Note that Err.Clear is used to clear the Err object's properties after the error is handled.

Sub OnErrorStatementDemo() 
 On Error GoTo ErrorHandler ' Enable error-handling routine. 
 Open "TESTFILE" For Output As #1 ' Open file for output. 
 Kill "TESTFILE" ' Attempt to delete open 
 ' file. 
 On Error Goto 0 ' Turn off error trapping. 
 On Error Resume Next ' Defer error trapping. 
 ObjectRef = GetObject("MyWord.Basic") ' Try to start nonexistent 
 ' object, then test for 
'Check for likely Automation errors. 
 If Err.Number = 440 Or Err.Number = 432 Then 
 ' Tell user what happened. Then clear the Err object. 
 Msg = "There was an error attempting to open the Automation object!" 
 MsgBox Msg, , "Deferred Error Test" 
 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 55 ' "File already open" error. 
 Close #1 ' Close open file. 
 Case Else 
 ' Handle other situations here... 
 End Select 
 Resume ' Resume execution at same line 
 ' that caused the error. 
End Sub

Vea tambiénSee also

Soporte técnico y comentariosSupport and feedback

¿Tiene preguntas o comentarios sobre VBA para Office o esta documentación?Have questions or feedback about Office VBA or this documentation? Vea Soporte técnico y comentarios sobre VBA para Office para obtener ayuda sobre las formas en las que puede recibir soporte técnico y enviar comentarios.Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.