Errores en Visual Basic .NET o Visual Basic 2005

Resumen

En este artículo se describe las opciones para el control de excepciones en Microsoft Visual Basic .NET o Microsoft Visual Basic 2005.

Más información

Visual Basic .NET o Visual Basic 2005 admite dos maneras diferentes de evitar que un error inesperado al terminar una aplicación: control de errores no estructurado y control de errores estructurado. Estos eventos son errores de tiempo de ejecución: acrónimo de excepciones, que son respuestas a condiciones excepcionales o anormales causados por la ejecución de un bloque de código.

Control de errores no estructurado es el nombre que se utiliza en Visual Basic .NET o Visual Basic 2005 para hacer referencia al método que se utiliza en Microsoft Visual Basic 6.0 de control de errores. Control de errores estructurado se introdujo por primera vez a los programadores de Visual Basic en .NET y se realiza mediante el Try... Catch... Finalmente instrucción, que ha sido una característica de otros lenguajes de programación. Control de errores estructurado presenta una forma más sencilla de crear y mantener programas mediante controladores de errores consistentes y exhaustivos.


Aunque Visual Basic .NET o Visual Basic 2005 admite ambos métodos, los métodos no se puede implementar simultáneamente en el mismo procedimiento. La única excepción a esto es la instrucción Error , que puede ser utilizada en el control de errores estructurado. Es aconsejable que llevar a cabo todos los control de errores en Visual Basic .NET o Visual Basic 2005 con control de errores estructurado. Control de errores no estructurado puede degradar el rendimiento de la aplicación y los resultados en el código que es difícil de depurar y mantener.


En el caso de un error en tiempo de ejecución, ambos métodos de control de error buscan un controlador de errores local que se define en un bloque de código determinado. Si ningún controlador de errores local está presente, la excepción se propaga la pila de llamadas hasta que encuentra un controlador coincidente. La pila de llamadas representa todos los procedimientos que se ha llamado antes del punto de ejecución actual y que aún no han terminado. Si no hay ningún controlador se encuentra en los procedimientos de la pila de llamadas cuando se produce un error, se termina la aplicación.

Control de errores no estructurado

Control de errores no estructurado se implementa con la instrucción On Error , que se coloca al principio de un bloque de código que controle todas las posibles excepciones que se producen durante la ejecución del código. Todos los controladores de error de Visual Basic 6.0 en .NET son objetos que pueden tener acceso mediante el espacio de nombres Microsoft.VisualBasic.Information.Err . El controlador se establece en Nothing , cada vez que se llama al procedimiento. Debe colocar sólo una instrucción On Error en cada procedimiento, porque las instrucciones adicionales deshabilitar a todos los controladores anteriores definidos en dicho procedimiento.

Instrucción On Error

La instrucción On Error se utiliza para habilitar una rutina de tratamiento de errores, deshabilite una rutina de control de errores o especifique dónde desea bifurcar el código en caso de error.

   On Error { GoTo [ line | 0 | -1 ] | Resume Next }
Ir a la línea

Se utiliza para habilitar la rutina de tratamiento de errores, empezando en la ubicación especificada por el argumento de la línea . El argumento de la línea puede ser una etiqueta de línea o un número de línea que se encuentra en el procedimiento de cierre. Un error en tiempo de ejecución activa el controlador de errores y bifurca el control a la línea especificada. Si la línea especificada no se encuentra en el mismo procedimiento que la instrucción On Error , se produce un error de compilación.


Para evitar un comportamiento inesperado, coloque una instrucción Exit Sub , una instrucción Exit Function o una instrucción Exit Property justo antes de la etiqueta de línea o número de línea. Esto impide que el código de control de errores en ejecución cuando no se ha producido ningún error.


GoTo 0

Deshabilita al controlador de errores habilitado que se define en el procedimiento actual y restablece a Nothing.


GoTo -1

Deshabilita la excepción activa que se define en el procedimiento actual y restablece a Nothing.


Resume Next

Mueve el control de ejecución a la instrucción que sigue inmediatamente después de la instrucción que provocó el error en tiempo de ejecución, y continúa la ejecución desde este punto hacia adelante. Esta es la forma preferida para utilizar para el acceso a objetos, en lugar de utilizar la instrucción On Error GoTo .


Ejemplo

En el ejemplo de código siguiente, el controlador de errores está habilitado en la primera línea de la rutina con la instrucción De Error GoTo no estructurado . La ubicación de la rutina de tratamiento de errores se identifica con la etiqueta de línea Unstructured . La rutina de error implementa una simple instrucción Select Case que se ejecuta el bloque de código, según el error correspondiente.


La instrucción Resume Next al final del procedimiento de control de errores devuelve el control de la ejecución a la línea que sigue la línea que causó el error producido.


A continuación, se deshabilita el controlador de error con la instrucción On Error GoTo 0 , seguida de la instrucción On Error Resume Next , que reactiva el controlador de errores. Si se produce un error en tiempo de ejecución, la instrucción provoca la ejecución a la rama a la línea que sigue inmediatamente a la línea que causó el error que se produzca, del mismo modo que hace la instrucción Resume Next en la rutina de control de errores. En este caso, esa línea es la instrucción If que se evalúa como el número de error y se muestra al usuario, así como borrar el objeto error.

   Public Sub fnErrors()   On Error GoTo Unstructured ' Enable error handler

Dim Result As Integer
Dim Value1 As Integer = 9
Dim Value2 As Integer = 0

On Error GoTo 0 ' Disables the error handler

'Moves execution to the line following the line that caused the error.
On Error Resume Next

Result = Value1 / Value2 ' Division by zero, cause an overflow error.

' Catch the overflow error caused by dividing by zero.
If Err.Number = 6 Then
MessageBox.Show("Error Number: " & Err.Number.ToString)
Err.Clear() ' Clear Errors
End If
Exit Sub

Unstructured: ' Location of error handler
Select Case Err.Number
Case 6
' Display the error number.
MessageBox.Show("Divided by zero")
Case Else
' Catch all other type of errors.
MessageBox.Show(Err.Description)
End Select
'Resume execution to the line following the line that caused the error.
Resume Next
End Sub

Control estructurado de errores

Control de errores estructurado, Visual Basic tiene ahora una forma eficaz de evitar errores inesperados que terminar la ejecución de la aplicación. Control de errores estructurado también proporciona a los programadores con una forma más sencilla de crear aplicaciones sólidas que son más fáciles de mantener.


Control de errores estructurado se implementa en Visual Basic. NET o Visual Basic 2005 con Try... Catch... Finalmente el bloque de instrucciones. El Try... Catch... Finalmente bloque proporciona, por primera vez en Visual Basic, la capacidad de control de errores anidados.

Try... Catch... Por último, instrucciones

El código siguiente muestra la estructura de un Try... Catch... Finalmente instrucción.
   Try      'Encapsulates a block of code that may produce a run-time error.
Catch [Optional Filters]
'The code runs if any of the statements in the Try block fails and filter is evaluated as true.
[Additional Catch Blocks]
Finally
'Code executed after Try and Catch statement.
End Try

El código que se espera que genere un error en tiempo de ejecución debe colocarse en el bloque Try para supervisar el tratamiento de errores. Si este código produce un error durante la ejecución, Visual Basic examina las instrucciones Catch implementado en el Try... Catch... Finalmente bloque para buscar una condición que coincida con el error. Si Visual Basic encuentra una condición coincidente, el control de la ejecución se transfiere a la primera línea de código dentro de la instrucción Catch . Si Visual Basic encuentra una condición coincidente, el error se propaga a la exterior Try... Catch... Finalmente instrucción. Esta instrucción puede encontrarse en el mismo procedimiento (instrucciones anidadas) o en un procedimiento anterior que llamó a la que se produjo un error. Este proceso se repite hasta que se encuentre una instrucción correspondiente. Si no se encuentra una instrucción coincidente, se produce un error y se termina la aplicación.

La instrucción Finally se ejecuta en último lugar, independientemente de si se han encontrado errores. En otras palabras, si no se encuentra ninguna instrucción Catch coincidente, la instrucción Finally se ejecuta antes de la propagación de las instrucciones externas.

Esta jerarquía y propagación se muestran con el siguiente código:

   Module StructuredError     Sub Main()
Try
fnStructured()
Catch ex As Exception ' Catches all exceptions.
Debug.WriteLine("Exception Information: " & vbCrLf & ex.ToString)
'Displays the representation of current exception.
Finally
Debug.WriteLine("Main: Finally executed !")
End Try
End Sub

Public Sub fnStructured()
'Nested Error Handling
Try
Try
Dim X As Integer = 9
Dim Y As Integer = 0
Dim Result As Integer
Result = X / Y
Catch e As DataException ' Catches only DataException.
'Displays the representation of current exception.
Debug.WriteLine("Exception Information: " & vbCrLf & e.Message)
Finally
Debug.WriteLine("fnStructured: Inner Finally executed !")
End Try
Catch e As InvalidCastException ' Catches only defined exception.
'Displays the representation of current exception.
Debug.WriteLine("Exception Information: " & vbCrLf & e.ToString)
Finally
Debug.WriteLine("fnStructured: Outer Finally executed !")
End Try
End Sub
End Module

En el ejemplo anterior, se genera un error en un procedimiento de fnStructured(). Se trata de un error de desbordamiento de pila, causado por la división por cero (0). Este procedimiento implementa dos Try... Catch... Finalmente bloques de instrucciones, pero ninguna de ellas tiene coincidencia de instrucciones Catch y no se captura el error. Antes de que el control se propaga en la pila de llamadas, se ejecuta el código que está encapsulado en el bloque Finally . El Try... Catch... Finalmente el bloque que se implementa en el Procedimiento Sub Main tiene una condición general que captura todas las excepciones que se producen en el bloque Try .


El siguiente es el resultado del procedimiento anterior:
fnStructured: Inner Finally executed !
fnStructured: Outer Finally executed !
Exception Information:
System.OverflowException: Arithmetic operation resulted in an overflow. at
StructuredError.StructuredError.fnStructured() in C:\Documents and
Settings\heikkiri\My Documents\Visual Studio Projects\Temp\StructuredError\StructuredError.vb:line 21 at
StructuredError.StructuredError.Main() in C:\Documents and
Settings\heikkiri\My Documents\Visual Studio
Projects\Temp\StructuredError\StructuredError.vb:line 5
Main: Finally executed !

El objeto Err

El objeto Err , que se hereda de Microsoft Visual Basic 6.0, sólo puede utilizarse para detectar errores en un procedimiento que se implementa con la instrucción On Error de control de errores no estructurado.


El objeto Err contiene información sobre un error de tiempo de ejecución que se ha producido durante la ejecución de la aplicación. Cuando la ejecución entra en un procedimiento que contiene el control de errores, se establecen las propiedades del objeto Err a cero (0) o cadena de longitud cero (""). Si se produce un error durante la ejecución, las propiedades se establecen a continuación, proporcionar información exclusiva sobre el error que se produjo, a través de sus propiedades. Una instancia del objeto Err puede obtenerse a través de una función Microsoft.VisualBasic.Information.Err ; Sin embargo, dado que el objeto Err es un objeto intrínseco con ámbito global, no es necesario crear una instancia de este objeto en tiempo de ejecución.


En el caso de un error en tiempo de ejecución, las propiedades del objeto Err se pueden utilizar para controlar el error (en función de su tipo), así como para mostrar información al usuario sobre el error que se produjo. En la tabla siguiente muestra las distintas propiedades que están asociadas con el objeto Err .


PropiedadDescripción
DescripciónDevuelve o establece un valor de tipo string que contiene una descripción del error que se produjo.
ErlDevuelve un valor entero que indica el número de línea de la última instrucción ejecutada.
ContextoDeAyuda (HelpContext)Devuelve o establece un valor de tipo integer que contiene el identificador de contexto para el tema de un archivo de ayuda.
ArchivoDeAyuda (HelpFile)Devuelve o establece una expresión de cadena que contiene la ruta de acceso completa del archivo de ayuda asociado con el error.
LastDLLErrorDevuelve un código de error del sistema generado por una llamada a un archivo de biblioteca de vínculos dinámicos (DLL).
NúmeroDevuelve o establece un valor numérico que especifica el error.
OrigenDevuelve o establece un valor de tipo string que especifica el nombre del objeto o la aplicación que originó el error.

El objeto Err tiene dos métodos asociados: Elevar y claro.

MétodoDescripción
BorrarSe utiliza para borrar todas las propiedades del objeto Err .
RaiseSe utiliza para generar un error en tiempo de ejecución, identificado con el número de error que se pasa como uno de sus parámetros.

Exception (clase)

   System.Object      System.Exception

Como se indicó anteriormente en este artículo, el mejor método de control de errores en Visual Basic .NET o Visual Basic 2005 es el control de errores estructurado, que se implementa con un Try... Catch... Finalmente bloque. Todas las excepciones que se detectan en Visual Basic .NET o Visual Basic 2005 se derivan de esta clase, por ejemplo, con la excepción OverFlowException. En el caso de un error en tiempo de ejecución, Visual Basic .NET o Visual Basic 2005 produce un objeto Exception que puede ser generada por el sistema o personalizados generados. En la sección "Control de errores estructurado" de este artículo se describe el método para detectar estas excepciones .

Cuando se produce la excepción, el objeto Err global se establece a los valores correspondientes y se crea una nueva instancia de un objeto de excepción . Esta instancia contiene más información sobre el error que se produjo. Por ejemplo, la propiedad StackTrace contiene una lista de métodos que se han llamado y llevado a la aparición del error.


En la tabla siguiente muestra las propiedades públicas que están disponibles para las excepciones que se detectan en el control de errores estructurado.


PropiedadDescripción
HelpLinkDevuelve o establece el vínculo al archivo de ayuda asociado a esta excepción.
InnerExceptionDevuelve una instancia de la excepción que causó la excepción actual.
MensajeDevuelve un mensaje que describe la excepción.
OrigenDevuelve o establece el nombre de la aplicación o el objeto que provocó el error.
StackTraceDevuelve una cadena que se presenta los marcos en la pila de llamadas en el momento cuando se produjo la excepción.
TargetSiteDevuelve el método que produjo la excepción.


En la tabla siguiente muestra los métodos públicos que implementan la clase de excepción .

MétodoDescripción
Es igual a (heredado de Object)Método sobrecargado que se utiliza para determinar si dos instancias del objeto son iguales.
GetBaseExceptionCuando este método se reemplaza en una clase derivada, devuelve la excepción que es la causa principal de una o más excepciones posteriores.
GetHashCodeSirve como función hash para un tipo determinado; conveniente para el uso en algoritmos hash y estructuras.
GetObjectDataCuando se invalida en una clase derivada, GetObjectData establece el objeto SerializationInfo con información sobre la excepción.
GetType (heredado de Object)Devuelve el tipo de la instancia actual.
ToStringSe reemplaza la función que crea y devuelve una presentación de la cadena de la excepción.

Se ha conservado el objeto Err de Visual Basic .NET o Visual Basic 2005 por motivos de compatibilidad y para facilitar la migración de Visual Basic 6.0 a Visual Basic .NET o en aplicaciones de Visual Basic 2005. Se recomienda que todos los errores en aplicaciones de Visual Basic .NET o Visual Basic 2005 realizarse utilizando el control estructurado de excepciones y errores.

Referencias

Archivos de ayuda:
  • Control estructurado de excepciones
  • Control estructurado de excepciones
  • Err (objeto)
  • Exception (clase)
Propiedades

Id. de artículo: 311326 - Última revisión: 22 ene. 2017 - Revisión: 1

Comentarios