sábado, 29 de noviembre de 2014

Manejo de Excepciones en Visual Basic.net

Control estructurado de excepciones
 
En el control estructurado de excepciones, los bloques de código se encapsulan y cada uno de ellos tiene uno o varios controladores asociados. Cada controlador especifica una forma de condición de filtro para el tipo de excepción que controla. Cuando el código de un bloque protegido genera una excepción, se busca por orden en el conjunto de controladores correspondientes y se ejecuta el primero que contenga una condición de filtro coincidente. Un método puede tener varios bloques de control estructurado de excepciones y dichos bloques pueden además estar anidados.
La instrucción Try...Catch...Finally se utiliza específicamente para el control estructurado de excepciones.
Aquí en este manualillo solo se explicará este método, el control estructurado de excepciones.
Visual Basic admite el control estructurado de excepciones, que facilita la tarea de crear y mantener programas mediante controladores de errores consistentes y exhaustivos. El control estructurado de excepciones es un código diseñado para detectar y dar respuesta a los errores que se producen durante la ejecución, mediante la combinación de una estructura de control (similar a Select Case o While) con excepciones, bloques de código protegidos y filtros.
 
El uso de la instrucción TryCatchFinally permite proteger bloques de código con posibilidades de generar errores. Los controladores de excepciones pueden anidarse, y las variables que se declaren en cada bloque tendrán un ámbito local.
 
 
Try
‘El código que puede producir el error
Catch [filtros opcionales o tipos de errores a capturar]
‘Código para cuando se produzca un error
 [bloques catch adicionales]
Finally
‘Código para cuando aparezca o no un error
End Try
 
El bloque Try de un controlador de excepción Try...Catch...Finally contiene la sección del código que el controlador de errores va a supervisar. Si se produce un error durante la ejecución de cualquier parte del código de esta sección, Visual Basic examinará cada instrucción Catch de Try...Catch...Finally hasta que encuentre una cuya condición coincida con el error. Si la encuentra, el control se transferirá a la primera línea de código del bloque Catch. Si no se encuentra una instrucción Catch coincidente, la búsqueda continuará en las instrucciones Catch del bloque Try...Catch...Finally exterior que contiene el bloque en el que ocurrió la excepción. Este proceso se prolongará a lo largo de toda la pila hasta que se encuentre un bloque Catch coincidente en el procedimiento actual. De no encontrarse, se produciría un error.
El código de la sección Finally siempre se ejecuta en último lugar, inmediatamente antes que el bloque de control de errores pierda su ámbito, con independencia de que se ejecute el código de los bloques Catch. Sitúe el código de limpieza (el código que cierra los archivos y libera los objetos, por ejemplo) en la sección Finally.
 
Filtrar errores en el bloque Catch
Los bloques Catch ofrecen tres opciones para filtrar errores específicos. En una de ellas, los errores se filtran basándose en la clase de la excepción (en este caso ClassLoadException), como se muestra en el siguiente código:
Try  
   ' "Try" block.
Catch e as ClassLoadException  
   ' "Catch" block.
Finally  
   ' "Finally" block.
End Try
Si se produce un error ClassLoadException, se ejecuta el código del bloque Catch especificado.
En la segunda opción para filtrar errores, la sección Catch puede filtrar cualquier expresión condicional. Un uso común de este formato del filtro Catch consiste en comprobar números de error específicos, como se muestra en el código siguiente:
Try
   ' "Try" block.
Catch When ErrNum = 5 'Type mismatch.
   ' "Catch" block.
Finally
   ' "Finally" block.
End Try
 
Cuando Visual Basic encuentra el controlador de errores coincidente, ejecuta el código de este controlador y pasa el control al bloque Finally.
 
Nota   Al buscar un bloque Catch que controle una excepción, se evalúa el controlador de cada bloque hasta encontrar uno que coincida. Puesto que estos controladores pueden ser llamadas a funciones, es posible que se produzcan efectos secundarios no esperados; por ejemplo, una llamada de este tipo puede cambiar una variable pública y provocar que ésta se utilice en el código de un bloque Catch distinto que termina controlando la excepción.
La tercera alternativa, consiste en combinar las primeras dos opciones y utilizar ambas para el control de excepciones.
El bloque Finally siempre se ejecuta, con independencia de cualquier otra acción que tenga lugar en los bloques Catch anteriores. No puede utilizar Resume o Resume Next en el control estructurado de excepciones.
 
Ahora se realizarán una serie de ejemplos que aclararán lo expuesto
 
Ejemplo 1.
 
Module Module1
 
    Sub Main()
        Dim sValor As String
        Dim iNumero As Integer
        Try
            'Aqui comienza el control de errores
            Console.WriteLine("Introducir un número")
            sValor = Console.ReadLine
            'Si no hemos introducido ningún número
            iNumero = sValor 'aquí se producira un error
 
        Catch
            'Si se produce un error, se generará una excepción
            'que capturamos en este bloque de código
            'manipulador de excepción, definido por Catch
            Console.WriteLine("Error al introducir el número" & ControlChars.CrLf & "el valor {0} es incorrecto", sValor)
        End Try
        Console.Read()
    End Sub
 
End Module
 
Esta y las siguientes 2 líneas no pertenecen al código anterior
Observen que antes de module1 no están declaradas Option Explicit On o
Option Strict On.

No hay comentarios:

Publicar un comentario