Manejo de excepciones en VB.net

Fecha: 24/Feb/2005 (16 de Febrero del 2005)
Autor: Jesús Enrique Gonzáles Azcarate
Email: [email protected]

 


Lo siguiente fue extraído de la ayuda, que otra mejor explicación que esa.

 

Visual Basic admite un control de excepciones (errores) tanto estructurado como no estructurado.

El control de errores estructurado y no estructurado permite establecer un plan para detectar posibles errores, y así impedir que éstos interfieran en los supuestos objetivos de la aplicación.

Si se produce una excepción en un método que no esté preparado para controlarla, la excepción se propagará de vuelta al método de llamada o al método anterior. Si el método anterior tampoco tiene controlador de excepciones, la excepción se propagará de vuelta al llamador del método, y así sucesivamente. La búsqueda de un controlador continuará hasta la pila de llamadas, que es la serie de procedimientos a los que se llama dentro de la aplicación. Si ésta tampoco encuentra un controlador para la excepción, se mostrará un mensaje de error y la aplicación finalizará.

 

Nota   Un método puede contener un método de control de excepciones estructurado o uno no estructurado, pero no ambos.

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.

 

 

Ejemplo 2. El clásico de la división por cero el que está en todos los libros

 

Module Module1

 

    Sub Main()

        Dim x As Integer = 5

        Dim y As Integer = 0

        Try

            x /= y

        Catch ex As Exception When y = 0

            Console.WriteLine(ex.Message)

        Finally

            Console.WriteLine("Este código siempre se ejecuta")

        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.

 

Otra forma de generar la anterior excepción es:

 

Ejemplo 3

 

Module Module1

 

    Sub Main()

        Dim x As Integer = 0

        Try

            Dim y As Integer = 100 / x

        Catch e As ArithmeticException

            Console.WriteLine("ArithmeticException Handler: {0}", e.ToString())

        Catch e As Exception

            Console.WriteLine("Generic Exception Handler: {0}", e.ToString())

        End Try

        Console.Read()

    End Sub

 

End Module

 

Ejemplo 4

 

El siguiente ejemplo es el mismo del ejemplo 1 pero se le adicionó al final más código

 

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

        Dim dtFecha As Date

        Console.WriteLine("Introducir una fecha")

        'Si ahora se produce un error,

        'al no disponer de una estructura para controlarlo

        'se cancelará la ejecución

        dtFecha = Console.ReadLine

        Console.WriteLine("La fecha es {0}", dtFecha)

        Console.ReadLine()

    End Sub

 

End Module

 

Se debe tener en cuenta la forma de capturar los errores desde los más específicos hasta los más generales de lo contrario los errores serán tomados dentro del primer catch no permitiendo capturar el error específico que necesitamos.  Por ejemplo en el ejercicio anterior el catch es muy general esto quiere decir que cualquier error que se produzca entrará a este bloque.

 


ir al índice