Try, Catch y end Try

El Bloque Try…Catch…Finally…End Try, es una innovación apartir de .NET (ósea no existia en VB 6.0), a estas alturas ya no es una innovación puesto que el VS 2008 ya esta en las calles, con su framework 3.5 (aqui) pero vamos a comentar algunas cosas básicas y otras no tan básicas(al menos yo no las sabias). Este bloque como todos sabemos sirve para el manejo de las excepciones tanto propias, de nuestra aplicación, como las que podrían ocurrir que vamos a comentar mas adelante. Para comenzar vamos a ver un ejemplo web simple de cómo usar la sentencia try…catch.

Dim pintEntero As Integer = 3
Dim pobjObjeto As Object = “No númerico”
Dim pintresultado As Integer

Try

‘Esto va a dar un error de casteo, en tiempo de ejecución
pintresultado = pintEntero + CType(pobjObjeto, Integer)
Catch ex As InvalidCastException
‘Aca es donde vamos a atrapar esa excepcion
Response.Write(ex.Message)

Catch ex As Exception
‘No va a entrar acá porque es un error de casteo
‘entra en la excepción de arriba (en este caso particular)
Response.Write(ex.Message)

End Try

Aca se ven algunas cosas:
1-Hay varias sentencias catch, esto es porque es recomendable incluir varias para atrapar la mayor cantidad de excepciones y SIEMPRE al final poner la excepción genérica ósea, Catch ex As Exception. Cualquier catch que se coloque debajo de éste no se tomara en cuenta, aunque con esto no se aseguran atrapar el 100% de la excepciones porque hay algunas que heredan por ejemplo de System.Reflection.
2-Una vez tomada la excepción se pueden hacer muchas cosas lo mas recomendado es mostrarle al usuario algo como para que sepa que paso, sin mostrarle mucha información 1ero porque al usuario no le interesa que un object no se puede castear a integer, con mostrarle un mensaje de Error simple alcanza y 2do porque puede ser un usuario mal intencionado y si en vez de generar un error simple como el que muestro el error viene de la base de datos ya le estaríamos dando una poderosa información para que te pueda atacar el sistema.
3-Al que si interesa que hubo un error y exactamente cual fue es a nosotros (los desarrolladores) y ahí es donde se puede aprovechar mucho el catch logeando la excepción en la BD o en el visor de Suceso de Windows, etc.

When

Un dato interesante es la expresión When es opcional y permite mediante una condición que deberá ser True para tomar esa excepción, vamos al ejemplo asi se entiende mejor:

Dim pintEntero As Byte = 3
Dim pobjObjetoA As Object
Dim pobjObjetoB As Object
Dim
pintresultado As Byte

Try
‘Se puede ver la diferencia descomentando estas 2 líneas
‘ y comentando las 2 líneas siguientes

‘pobjObjetoA = -0.2
‘pintresultado = pintEntero / CType(pobjObjetoA, Double)
pobjObjetoB = -0.5
pintresultado = pintEntero / CType(pobjObjetoB, Double)
Catch ex As OverflowException When pobjObjetoA = -0.2
‘Aca es donde vamos a atrapar esa excepción siempre y cuando pobjObjetoA = -0.2
Response.Write(ex.Message + ” Para el caso A”)

Catch ex As OverflowException When pobjObjetoB = -0.5
‘Aca es donde vamos a atrapar esa excepción siempre y cuando pobjObjetoB = -0.5
Response.Write(ex.Message + ” Para el caso B”)

Catch ex As Exception
‘entra en la excepción de arriba (en este caso particular)
Response.Write(ex.Message)

End Try

La excepción es la misma pero dependerá del when para saber por donde entrar y al final el error genérico.

Finally

Se ubica después del ultimo catch (es opcional) y es importante recalcar que se ejecuta haya habido o no una excepción, ósea siempre se entra en el finally incluso si hay una sentencia de Return adentro del try…catch. Puede ser que se desee cerrar un archivo o liberar recursos o sessiones en el caso de webform, lo cierto es que va a entrar por ahí siempre, con lo cual hay que tener en cuenta eso. Aca esta el ejemplito simple como siempre:

Dim pintEntero As Byte = 3
Dim pobjObjetoA As Object
Dim pintresultado As Byte

Try

pintresultado = pintEntero / CType(pobjObjetoA, Double)
Catch ex As OverflowException
Response.Write(ex.Message)
Catch ex As Exception
Response.Write(ex.Message)
Finally
‘Asigno un nuevos valores
pintEntero = 3
pobjObjetoA = 2

End Try

Por ultimo a modo de información se detallan en forma jerárquica la mayoría de las excepciones(las más comunes).

Jerarquia de Excepciones

Y como comentaba al principio puede pasar el caso que se de en situaciones realmente extremas donde las excepciones son inesperadas como por ejemplo StackOverFlowException o OutOfMemory que si esto pasa es porque, para decirlo en criollo, estas al horno no por tu aplicaciones porque estas excepciones pueden producirse por afuera de tu sistema pero lo mas probable es que el sistema colapse y en ese caso lo mejor es mostrar un error al usuario (como decía antes no decirle que va a explotar el mundo con letras rojas Arial 52 sino diciendo simplemente que se produjo un error grave en x modulo y el sistema debe cerrarse) y terminar la aplicación (logueando obviamente lo mejor que se pueda el error).

Para información mucho mas detallada sobre manejo de excepciones recomiendo los application Blocks (en general son todos buenos) pero en esta caso especifico están los Exception Handling.

Links:

Application Blocks 3.0 (para .NET 2.0) aqui

Application Blocks 2.0 (para .NET 2.0) aqui

Exception Application Blocks para .NET 1.1 aqui

Anuncios

2 comentarios sobre “Try, Catch y end Try

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s