Está en la página 1de 10

Práctica A: Implementar la gestión estructurada de

excepciones

Objetivos En este laboratorio, aprenderá a:


„ Utilizar la gestión estructurada de excepciones para controlar excepciones.

Nota Este laboratorio se centra en los conceptos de este módulo y por ello,
puede no cumplir las recomendaciones de seguridad de Microsoft.

Requisitos previos Para poder trabajar en este laboratorio, debe:


„ Estar familiarizado con la gestión estructurada de excepciones como técnica
para controlar errores.
„ Estar familiarizado con la sintaxis Try…Catch…Finally.

Archivos de solución Los archivos de solución de este laboratorio se encuentran en las carpetas
Ex01\Solution y Ex02\Solution dentro del fichero labs08.zip.
Tiempo estimado para
realizar este laboratorio:
45 minutos
Ejercicio 1
Uso de los bloques Try…Catch
En este ejercicio, agregará bloques Try…Catch para controlar excepciones en
un programa existente que abre y muestra el contenido de un archivo de texto.

Ë Abrir el proyecto
• Abra el proyecto ExceptionApplication.sln ubicado en la carpeta
Ex01\Starter dentro del fichero labs08.zip.

Ë Examinar el procedimiento Sub Main


• Abra el procedimiento Sub Main en FileOpen.vb y observe lo siguiente:
a. FileStream se utiliza para abrir un archivo.
b. StreamReader se utiliza para leer líneas de texto desde un archivo de
texto.
c. MessageBox se utiliza para mostrar la línea leída desde el archivo.
d. Finalmente, FileStream y StreamReader están cerrados.

Ë Generar la aplicación
• En el menú Generar, haga clic en Generar solución.
¿Qué ocurre?
La generación falla debido a errores de sintaxis. Esto se debe a que la
biblioteca que contiene la clase MessageBox no está referenciada en el
proyecto.
____________________________________________________________

____________________________________________________________
Ë Arreglar el error
1. En el Explorador de soluciones, haga clic con el botón derecho en
Referencias y clic en Agregar referencia. En el cuadro de diálogo
Agregar Referencia, en la ficha .NET, haga clic en
System.Windows.Forms.dll. Haga clic en Seleccionar, y clic en Aceptar.
2. Después de arreglar los errores, genere la aplicación y ejecútela en modo de
depuración.
¿Qué ocurre cuando ejecuta la aplicación? ¿Por qué?
La aplicación deja de responder debido a una excepción no controlada.
El archivo test.txt no existe.
_____________________________________________________________

_____________________________________________________________

¿Cómo controlaría el error?


Agregando la gestión estructurada de excepciones para evitar que la
aplicación se detenga cuando un archivo no exista.
_____________________________________________________________

_____________________________________________________________

3. Haga clic en Continuar para cerrar la aplicación.

Ë Controlar la excepción utilizando Try…Catch


• Modifique el código del procedimiento Sub Main agregando un bloque
Try…Catch.
a. Incluya el código existente en el bloque Try…End Try.
b. Escriba un bloque Catch general para capturar las excepciones. Utilice
un cuadro de mensaje para mostrar el mensaje “Archivo no encontrado”.
Su código debería ser similar al siguiente:
Try
Dim file As New FileStream ("C:\test\test.txt",_
FileMode.Open)
Dim reader As New StreamReader (file)
Dim line As String = reader.ReadLine ( )
MessageBox.Show (line)
reader.Close ( )
file.Close ( )
Catch ex As Exception
MessageBox.Show ("Archivo no encontrado")
End Try
Ë Generar la aplicación
1. Ejecute la aplicación en modo de depuración.
¿Qué ocurre?
La aplicación muestra un mensaje informando al usuario de que no se
ha encontrado el archivo.
____________________________________________________________

____________________________________________________________

2. Haga clic en Aceptar en el cuadro de mensaje para cerrar la aplicación.

Ë Crear una carpeta y un archivo


1. Cree una carpeta con el nombre Test en la unidad C.
2. En el menú Inicio, seleccione Todos los programas, seleccione
Accesorios, y haga clic en Notepad.
3. En Notepad, escriba una línea de texto.
4. En el menú Archivo, haga clic en Guardar.
5. En el cuadro de diálogo Guardar como, vaya a la carpeta C:\Test, y guarde
el archivo con el nombre test.txt. Cierre el archivo.

Ë Generar y ejecutar la aplicación


1. Genere y ejecute la aplicación en modo de depuración.
¿Qué ocurre?
La aplicación muestra la línea de texto del archivo test.txt file en un
cuadro de mensaje.
____________________________________________________________

____________________________________________________________

2. Haga clic en el cuadro de mensaje OK para cerrar la aplicación.

Ë Agregar otro bloque Catch


• Agregue otro bloque Catch después del bloque Catch existente. El segundo
bloque Catch debería capturar una DirectoryNotFoundException. En el
bloque Catch, utilice un cuadro de mensaje para mostrar el mensaje de error
“Ruta incorrecta”.
El código completo debería ser similar al siguiente:
Catch ex As Exception
MessageBox.Show("Archivo no encontrado")
Catch ex As DirectoryNotFoundException
MessageBox.Show("Ruta incorrecta")
Ë Modificar la ruta del archivo
• En su código, cambie la ruta al archivo test.txt a C:\BadPath\test.txt. Su
código debería ser similar a la siguiente línea de código:
Dim file As New FileStream ("c:\BadPath\test.txt", _
FileMode.Open)

Ë Generar y probar la aplicación


1. Ejecute la aplicación en modo de depuración.
¿Qué ocurre? ¿Por qué?
Aparece un mensaje de error incorrecto, “Archivo no encontrado”,
debido a que el orden de los bloques Catch no es correcto. Los bloques
Catch deberían estar organizados de específico a general. En este caso,
el primer bloque Catch es el general y, por tanto, captura todos los tipos
de excepciones. El segundo bloque Catch no se ejecuta.
_____________________________________________________________

_____________________________________________________________

¿Cómo arreglaría el error?


Moviendo el bloque Catch ex As Exception al final del bloque
Try…Catch, cambiando el mensaje que muestra el bloque Catch
general, y añadiendo otro bloque Catch para controlar una
FileNotFoundException.
_____________________________________________________________

_____________________________________________________________

2. Haga clic en OK para cerrar la aplicación.

Ë Modificar los bloques Catch


1. En su código, cambie la ruta al archivo test.txt a C:\test.txt. Su código
debería ser similar a la siguiente línea de código:
Dim file As New FileStream ("c:\test.txt", FileMode.Open)

2. Mueva el bloque Catch ex As Exception al final del bloque


Try…Catch. Utilice la llamada del cuadro de mensaje para mostrar la
propiedad Message de la clase Exception.
3. Agregue un nuevo bloque Catch como primer bloque Catch para controlar
una FileNotFoundException. Utilice un cuadro de mensaje para mostrar un
mensaje adecuado. Su código debería ser similar al siguiente:
Catch ex As FileNotFoundException
MessageBox.Show("Archivo no encontrado")
Catch ex As DirectoryNotFoundException
MessageBox.Show("Ruta incorrecta")
Catch ex As Exception
MessageBox.Show(ex.Message)
Ë Generar y probar la aplicación
1. Ejecute la aplicación en modo de depuración y compruebe que aparece el
mensaje de error “Archivo no encontrado”.
2. Haga clic en OK para cerrar la aplicación.
3. En su código, cambie la ruta al archivo test.txt a A:\test.txt. Su código
debería ser similar a la siguiente línea de código:
Dim file As New FileStream ("a:\test.txt", FileMode.Open)

4. Vuelva a ejecutar la aplicación en modo de depuración.


El último bloque Catch controla la excepción y muestra el mensaje
adecuado utilizando la propiedad Message de la clase Exception.
5. Haga clic en OK en el cuadro de mensaje para cerrar la aplicación.
Ejercicio 2
Uso de los bloques Try…Catch…Finally
En este ejercicio, utilizará los bloques Try…Catch…Finally para controlar
excepciones. Utilizará puntos de interrupción y el comando Ejecutar hasta el
cursor para depurar una aplicación. Modificará un programa existente que lee
de un archivo de texto un importe de venta, calcula y muestra un descuento.

Ë Abrir el proyecto
• Abra el proyecto ExceptionApplication.sln ubicado en la carpeta
Ex02\Starter dentro del fichero labs08.zip.

Ë Examinar el procedimiento Sub Main


• Abra el procedimiento Sub Main en FileOpen.vb, y observe lo siguiente:
a. La función FileStream se utiliza para abrir el archivo input.txt ubicado
en la carpeta Ex02\Starter\bin.
b. La función StreamReader se utiliza para leer texto del archivo.
c. La función CInt se utiliza para convertir los datos leídos del archivo en
el tipo de datos Integer.
d. Se utiliza un cuadro de mensaje para calcular un descuento sobre la
cantidad leída del archivo, y para mostrar el importe con el descuento al
usuario.
e. File y reader están cerrados.
f. Se utiliza un bloque Catch para controlar todas las excepciones.

Ë Examinar el archivo de texto


• Abra el archivo input.txt de la carpeta Ex02\Starter\bin. Observe que este
archivo contiene una cantidad de compra de 100.

Ë Generar y probar la aplicación


1. Ejecute la aplicación en modo de depuración.
¿Qué ocurre?
Un cuadro de mensaje muestra una cantidad de descuento de $8.00.
_____________________________________________________________

_____________________________________________________________

2. Haga clic en OK en el cuadro de mensaje para cerrar la aplicación.

Ë Modificar el archivo de texto


1. Utilizando Notepad, abra el archivo de la carpeta Ex02\Starter\bin. Cambie
la cantidad 100 por 100b.
2. Guarde y cierre el archivo.
Ë Generar y probar la aplicación
1. Ejecute la aplicación en modo de depuración.
¿Qué ocurre?
Un cuadro de mensaje muestra un mensaje informando de que se ha
producido un error de casting.
____________________________________________________________

____________________________________________________________

2. Haga clic en OK en el cuadro de mensaje para cerrar la aplicación.

Ë Depurar la aplicación
1. Establezca un punto de interrupción en la línea de código
MessageBox.Show.
2. Vuelva a ejecutar la aplicación en modo de depuración.
¿Por qué la aplicación no ha entrado en modo de interrupción en el punto de
interrupción?
La excepción se ha producido antes de la línea de código
MessageBox.Show. Cuando una excepción ocurre en una línea de un
bloque Try, las líneas de código restantes del bloque Try no se ejecutan
y el flujo se transfiere al bloque Catch.
____________________________________________________________

____________________________________________________________

3. Haga clic en OK en el cuadro de mensaje para cerrar la aplicación.


4. Elimine el punto de interrupción.
5. Coloque el punto de inserción en la línea Try, e inicie la aplicación
utilizando el comando Ejecutar hasta el cursor.
6. Utilice la tecla F8 para recorrer paso a paso su código.
¿Qué línea lanza la excepción? ¿Por qué?
La línea CInt(reader.ReadLine( )) lanza un error
InvalidCastException porque falla la conversión de tipo de datos.
____________________________________________________________

____________________________________________________________

¿Se ejecuta el código para cerrar file y reader después de que se produzca
la excepción?
No.
____________________________________________________________

____________________________________________________________
¿Cómo puede asegurarse de que el código para cerrar file y reader siempre
se ejecute?
Escribiendo explícitamente el código para cerrar estos recursos en un
bloque Finally.
_____________________________________________________________

_____________________________________________________________

7. Cerrar la aplicación.

Ë Agregar un bloque Finally


1. Agregue un bloque Finally antes de la instrucción End Try.
2. En el bloque Try, elimine las llamadas al método Close.
3. En el bloque Finally, cierre los objetos file y reader. Su código debería ser
similar al siguiente:
Finally
file.Close ( )
reader.Close ( )

4. Observe que este código contiene dos errores de sintaxis. ¿Cuál es la causa
de los errores?
File y reader sólo tienen visibilidad a nivel de bloque porque están
declarados en el bloque Try.
_____________________________________________________________

_____________________________________________________________

5. Declare las variables file y reader fuera del bloque Try, y cambie el código
dentro del bloque Try para crear nuevas instancias de las clases FileStream
y StreamReader y asignarlas a estas variables. Su código debería ser
similar al siguiente:
Sub Main

Dim file As FileStream


Dim reader As StreamReader

Try
file = New FileStream("input.txt", FileMode.Open)
reader = New StreamReader(file)
...
Catch ex as Exception
MessageBox.Show(ex.Message)

Finally
...

End Try
Ë Probar la aplicación
1. Establezca un punto de interrupción en la instrucción Finally.
2. Genere y ejecute la aplicación en modo de depuración.
3. Haga clic en OK en el cuadro de mensaje, y utilice la tecla F8 para recorrer
paso a paso el código y verificar que la aplicación ejecuta el código del
bloque Finally.
4. Cierre la aplicación.
5. Elimine el punto de interrupción.

Ë Modificar la ruta del archivo


• Modifique la ruta del archivo como se muestra en la siguiente línea de
código:
file = New FileStream("c:\input.txt", FileMode.Open)

Ë Probar la aplicación
1. Ejecute la aplicación en modo de depuración. En el cuadro de mensaje que
aparece, haga clic en OK.
¿Por qué se produce una excepción no controlada de tipo
NullReferenceException?
Esta excepción se produce porque se ha realizado un intento de invocar
el método Close en un objeto de archivo que no existe. El archivo de
input no existe en la carpeta C:\. Como este archivo no existe, la nueva
instancia de la clase FileStream no se ha creado.
____________________________________________________________

____________________________________________________________

2. Haga clic en Continue para cerrar la aplicación.


3. En el bloque Finally, antes de invocar el método Close, utilice la función
IsNothing para comprobar si los objetos existen. Su código debería ser
similar al siguiente:
...
Finally
If Not IsNothing (reader) Then reader.Close( )
If Not IsNothing (file) Then file.Close( )
End Try

Ë Probar la aplicación
• Genere y ejecute la aplicación.
Ahora, la aplicación debería capturar la excepción, mostrar un cuadro de
mensaje, y cerrarse después de hacer clic en OK en el cuadro de mensaje.

También podría gustarte