8. Manejo de Errores

51
Manejo de errores y excepciones Índice Descripción………………………………………….……..1 Lección: Tipos de errores………………….……….2 Lección: Uso del depurador………………………10 Lección: Gestión de excepciones……………..38

Transcript of 8. Manejo de Errores

Page 1: 8. Manejo de Errores

Manejo de errores y excepciones

Índice

Descripción………………………………………….……..1

Lección: Tipos de errores………………….……….2

Lección: Uso del depurador………………………10

Lección: Gestión de excepciones……………..38

Page 2: 8. Manejo de Errores
Page 3: 8. Manejo de Errores

Manejo de errores y excepciones 1

Descripción

Tipos de errores

Uso del depurador

Manejo de excepcionesUso de Visual

Studio .NET

Acceso A datos

Escribir Código

Crear Interfaz

Depurare Implantar

Introducción A medida que los programas son más grandes y más complejos, es inevitable que se produzcan un determinado número de errores. Incluso la programación más cuidadosa puede producir errores involuntarios, también denominados bugs. El proceso de encontrar y eliminar estos errores se denomina depuración (debugging).

En este módulo, estudiaremos los tipos de errores que pueden ocurrir en un programa y cómo utilizar el depurador de Microsoft® Visual Studio® .NET, las diversas ventanas de depuración y la gestión estructurada de excepciones para ayudar a diagnosticar, corregir y realizar el tratamiento de errores.

Objetivos En este módulo, aprenderemos a:

Definir y ver ejemplos de errores de sintaxis, tiempo de ejecución y lógica. Depurar código utilizando el depurador de Visual Studio .NET. Implementar en nuestra aplicación la gestión estructurada de excepciones.

Page 4: 8. Manejo de Errores

2 Manejo de errores y excepciones

Lección: Tipos de errores

¿Qué son los errores de sintaxis?

¿Que son los errores de tiempo de ejecución?

¿Que son los errores de lógica?

Introducción Los errores de programación normalmente se dividen en tres categorías: errores de sintaxis, errores de tiempo de ejecución y errores de lógica. Utilizaremos diferentes métodos y herramientas para encontrar y solucionar cada tipo de error.

Estructura de la lección Esta lección incluye los siguientes temas y actividades:

¿Qué son los errores de sintaxis? ¿Qué son los errores de tiempo de ejecución? ¿Qué son los errores de lógica? Demostración: Tipos de errores

Objetivo de la lección En esta lección, aprenderemos a describir la diferencia entre errores de sintaxis,

de tiempo de ejecución y de lógica.

Page 5: 8. Manejo de Errores

Manejo de errores y excepciones 3

¿Qué son los errores de sintaxis?

Visualizar errores en la Lista de tareas:

Error de sintaxisError de sintaxisError de sintaxisError de sintaxis

Introducción El tipo más obvio de error es un error de sintaxis, que tiene lugar cuando escribimos código de un modo no permitido por las reglas del lenguaje. Algunos ejemplos más habituales incluyen una palabra clave mal escrita, la omisión de puntuación requerida, o una construcción incorrecta (como una instrucción For sin la correspondiente instrucción Next, o la palabra clave If en una línea sin un operador condicional).

Encontrar errores de sintaxis

Visual Basic® .NET muestra los errores de sintaxis mientras escribimos cada instrucción del código de nuestra aplicación. La parte de código que contiene el error aparece con un subrayado en forma de diente de sierra. Cuando colocamos el cursor del ratón sobre el código subrayado, aparece un consejo con una breve descripción del error junto al cursor.

Los errores de sintaxis son recogidos por el compilador, el cual muestra un mensaje de error informándonos del problema. Si ignoramos los errores de sintaxis mientras escribimos el código, podemos visualizar y abordarlos en cualquier momento en la ventana de la Lista de tareas. Si intentamos generar nuestra aplicación sin corregir los errores de sintaxis, la ventana de la Lista de tareas mostrará todos los errores incluidos en la lista.

Page 6: 8. Manejo de Errores

4 Manejo de errores y excepciones

Visualizar errores en la ventana Lista de tareas

La ventana Lista de tareas incluye una descripción del error, la ruta al archivo en el que se ha producido el error y el número de la línea del código que contiene el error. La descripción del error es la misma información que obtenemos si posicionamos el cursor del ratón sobre la parte subrayada del código en el Editor de código.

Podemos editar los errores haciendo doble clic en la entrada correspondiente en la Lista de tareas. El punto de inserción se posiciona en el archivo correcto y la línea exacta donde se encuentra el error, de modo que podemos cambiar nuestro código. En cuanto finalicemos los cambios y salgamos de la línea modificada, se actualizarán las entradas de la ventana Lista de tareas.

En la ventana Lista de tareas, también podemos ver tareas que hemos creado comentando nuestro código con la frase TODO.

Visualizar errores en la ventana de Resultados

También podemos utilizar la ventana Resultados para ver los errores de generación. Esta ventana muestra una lista de avisos, errores y el estado de generación mientras Visual Studio .NET está generando la aplicación. Al final del proceso de generación, proporciona un resumen, incluyendo la ubicación de los errores de sintaxis (número de línea y archivo) y una breve descripción de los problemas.

Page 7: 8. Manejo de Errores

Manejo de errores y excepciones 5

¿Qué son los errores de tiempo de ejecución?

Speed = Miles/Hours

' If Hours = 0, the statement is syntactically correct, but the division is an invalid operation

Speed = Miles/Hours

' If Hours = 0, the statement is syntactically correct, but the division is an invalid operation

Introducción Los errores de tiempo de ejecución son errores que ocurren cuando una instrucción intenta realizar una operación que es imposible llevar a cabo; por ejemplo, referenciar un objeto inaccesible. Los errores de tiempo de ejecución apareen durante la ejecución del código.

Ejemplo de un error en tempo de ejecución

Con frecuencia, los errores de tiempo de ejecución son el resultado de acciones imprevistas. Por ejemplo, un usuario podría olvidar insertar un disquete en una unidad, o seleccionar un archivo de entrada de datos no válido. Un error habitual en tiempo de ejecución es intentar dividir por cero. Pensemos en el siguiente código:

Velocidad = Kilómetros / Horas

Si la variable Horas es igual a cero, la división es una operación no válida, aunque la instrucción sea sintácticamente correcta.

Consecuencias de los errores de tiempo de ejecución

El compilador no captura errores de tiempo de ejecución. Los compiladores únicamente capturan errores en la estructura del código que escribimos, no errores en la funcionalidad.

Si se produce un error de tiempo de ejecución no gestionado mientras nuestro programa se está ejecutando como una generación en modo debug, aparecerá un mensaje de error que nos permitirá entrar en modo de interrupción y abordar el problema. Si se produce un error de tiempo de ejecución cuando nuestra aplicación se está ejecutando como una generación en modo release, puede hacer que nuestro programa se detenga respondiendo con o sin un mensaje de error. En términos coloquiales, puede hacer que su programa falle o se cuelgue.

Podemos utilizar las herramientas de depuración de Visual Studio .NET para aislar errores y escribir código de control de errores para controlar las condiciones que podrían generar errores de tiempo de ejecución. Para controlar los errores de tiempo de ejecución, también podemos escribir controladores de excepciones que atrapen los errores y lleven a cabo una acción prescrita, como corregir el problema, indicando al usuario que realice una acción, o guardando

Page 8: 8. Manejo de Errores

6 Manejo de errores y excepciones

datos antes de finalizar el programa. Otro modo de minimizar errores de tiempo de ejecución es validar todas las formas de introducción de datos del usuario.

Page 9: 8. Manejo de Errores

Manejo de errores y excepciones 7

¿Qué son los errores de lógica?

Definición: Un error que hace que una aplicación produzca resultados incorrectos

Puede no generar un mensaje de error

Se encuentra probando la aplicación y analizando los resultados

Dim x As Integer = 2

Do While x < 10

' Code statements

x -= 1

Loop

Dim x As Integer = 2

Do While x < 10

' Code statements

x -= 1

Loop

Introducción Los errores lógicos son errores que se producen cuando una aplicación no se comporta del modo previsto. Estos errores son especialmente difíciles de encontrar porque es posible que no generen un mensaje de error. Una aplicación puede tener un código válido sintácticamente y ejecutarse sin realizar ninguna operación no válida, pero producir resultados incorrectos.

Ejemplo de error lógico El siguiente código contiene un error lógico que en algún momento provocará un error de tiempo de ejecución.

Dim x As Integer = 2 Do While x < 10 ' Code statements x -= 1 Loop

En este código, el bucle While se ejecuta mientras el valor de x es menor de 10. Dentro del bucle, la instrucción x -= 1 contiene un error lógico, ya que el valor de inicio de x es 2, y el valor se disminuye en 1 cada vez que el bucle se ejecuta. La condición x < 10 será siempre verdadera, lo cual produce un bucle infinito. Se producirá un error de tiempo de ejecución cuando el valor de x exceda el valor que puede almacenarse en un Integer.

Encontrar y solucionar errores lógicos

El único modo de verificar que una aplicación funciona correctamente es probarla y analizar los resultados. Como parte del proceso de depuración, podemos utilizar las herramientas de depuración de Visual Studio .NET para aislar y corregir errores lógicos de nuestro código.

Page 10: 8. Manejo de Errores

8 Manejo de errores y excepciones

Demostración: Tipos de errores

En esta demostración, estudiaremos los siguientes tipos de errores, y verá un ejemplo de cada error en el entorno de Visual Studio .NET :

Error de sintaxis

Error de tiempo de ejecución

Error de lógica

En esta demostración, estudiaremos distintos tipos de errores.

Crear un error de sintaxis

1. Iniciar Visual Studio .NET. 2. Crear una aplicación basada en Microsoft Windows®. 3. Agregar un control Button a Form1. 4. Crear un controlador de eventos para el evento Button1_Click. El

controlador de eventos mostrará un cuadro de mensaje cuando el usuario hacer clic en el botón.

5. En la lista de parámetros de la función MessageBox, utilizar el carácter de continuación de línea para romper incorrectamente el código de los parámetros del cuadro de mensaje. Nuestro código debería ser similar al siguiente: MessageBox.Show("Compile-time Error", MessageBox _ Buttons.OK)

6. Intentar la generación de la aplicación. Se creará un error de sintaxis. 7. Solucionar el problema eliminando el carácter de continuación de línea, y

generar de nuevo la aplicación.

Page 11: 8. Manejo de Errores

Manejo de errores y excepciones 9

Crear un error de tiempo de ejecución

1. Modificar el controlador de eventos Button1_Click. Sustituir el código por el código siguiente, el cual generará un error de tiempo de ejecución al intentar dividir por cero. Dim i, j As Integer j = 0 i = 4 / j

2. Generar y ejecutar la aplicación. 3. Hacer clic en Button1. Se generará un error de tiempo de ejecución. 4. En el cuadro de diálogo Microsoft Development Environment, hacer clic

en Continuar para cerrar la aplicación.

Crear un error lógico

1. Añadir dos controles TextBox a Form1. 2. Eliminar el código existente en el controlador de eventos Button1_Click. 3. Añadir el siguiente código, que lee dos valores de los cuadros de texto,

añade los valores y muestra el resultado en un cuadro de mensaje. MessageBox.Show(TextBox1.Text + TextBox2.Text)

4. Generar y ejecutar la aplicación. 5. Escribir dos números en los cuadros de texto. 6. Hacer clic en Button1. El resultado es la concatenación de los dos números,

que no es el resultado previsto. Éste es un error lógico. 7. Cerrar la aplicación y cambiar el código para utilizar la función CInt.

Nuestro código debería ser similar al siguiente: MessageBox.Show(CInt(TextBox1.Text) + CInt(TextBox2.Text))

8. Generar y ejecutar la aplicación. 9. Escribir dos valores enteros en los cuadros de texto y hacer clic en Button1. 10. Cerrar la aplicación.

Page 12: 8. Manejo de Errores

10 Manejo de errores y excepciones

Lección: Uso del depurador

¿Qué es el Modo Break?

Cómo utilizar Breakpoints

Cómo modificar Breakpoints

La barra de herramientas de depuración

How to Step Through Code

Cómo utilizar las ventanas de depuración

Cómo utilizar la ventana Command

Introducción Las herramientas de depuración resultan de ayuda en el diagnóstico de errores del programa al ayudarnos a examinar el flujo de nuestro programa. Podemos utilizar herramientas de depuración para detener nuestro programa en ubicaciones establecidas durante la ejecución del código, examinar cambios en valores de variables y propiedades, y movernos paso a paso por partes del código.

Estructura de la lección Esta lección incluye los siguientes temas y actividades:

Demostración: cómo depurar una aplicación ¿Qué es el modo de interrupción? Cómo utilizar puntos de interrupción Cómo modificar puntos de interrupción La barra de herramientas Depuración Recorrer paso a paso el código Demostración: cómo utilizar las ventanas de depuración Cómo utilizar las ventanas de depuración Cómo utilizar la Ventana de comandos Práctica: código de depuración

Objetivos de la lección En esta lección, aprenderemos a:

Establecer, eliminar y modificar puntos de interrupción. Recorrer el código utilizando los comandos Step y la sintaxis Ejecutar

hasta el Cursor. Utilizar las siguientes ventanas para inspeccionar nuestro programa: la

ventana Automático, la ventana Pila de llamadas, la ventana Comandos, la ventana Variables locales y la ventana Inspección.

Page 13: 8. Manejo de Errores

Manejo de errores y excepciones 11

Demostración: Cómo depurar una aplicación

En esta demostración, aprenderemos cómo depurar una aplicación utilizando breakpoints, stepping through código por líneas de y utilizando la ventan Watch para examinar variables en código.

En esta demostración, aprenderemos cómo depurar una aplicación utilizando puntos de interrupción, recorrer el código línea por línea y utilizando la ventana Inspección para examinar variables en el código.

Iniciar Visual Studio .NET y cargar el proyecto de la demostración.

1. Hacer clic en Inicio, seleccionar Todos los programas, seleccionar Microsoft Visual Studio .NET, y hacer clic en Microsoft Visual Studio .NET.

2. En la Página de inicio, en el panel de Inicio, hacer clic en Abrir proyecto. 3. En el cuadro de diálogo Abrir proyecto, ir a la carpeta

DebuggingApplication, y hacer doble clic en DebuggingApplication.sln. Esta carpeta se puede encontrar dentro del fichero demos08.zip.

Page 14: 8. Manejo de Errores

12 Manejo de errores y excepciones

Ejecutar la aplicación

4. En la barra de herramientas, hacer clic en el botón Iniciar. 5. En la ventana Form1, hacer clic en Button1.

Se producirá una excepción no controlada de tipo System.IndexOutOfRangeException.

6. En el cuadro de diálogo Microsoft Development Environment, hacer clic en Break.

7. Mover el cursor del ratón sobre index en la línea de código seleccionada. Observar que la sugerencia muestra 5 como valor de la variable index. La variable index se incrementa en el bucle For desde 0 al resultado de names.GetLength(0). El problema es que el método GetLength devuelve el número de elementos en la dimensión de una matriz. Debido a que las matrices se numeran desde cero, el valor devuelto por el método GetLength necesita reducirse en 1 para el bucle For…Next.

Corregir el código y probar la aplicación de nuevo

1. En el menú Depurar, hacer clic en Detener depuración. 2. En el Editor de código de Form1.vb, añadir el código – 1 al final de la

siguiente línea: For index = 0 to names.GetLength(0)

3. En la barra de herramientas, hacer clic en el botón Iniciar . 4. En el cuadro de diálogo Form1, hacer clic en Button1.

Observar que el cuadro de mensaje nos informa de que el nombre más largo guardado en la matriz es Tina. Esto no es correcto.

5. En el cuadro de mensaje, hacer clic en OK. 6. Cerrar Form1.

Utilizar un punto de interrupción para depurar la aplicación

1. En el Editor de código de Form1.vb, hacer clic en el margen para añadir un punto de interrupción a la siguiente línea de código: For index = 0 To names.GetLength(0) – 1

2. En la barra de herramientas, hacer clic en el botón Iniciar . 3. En el cuadro de diálogo Form1, hacer clic en Button1.

Observar que la ejecución se detiene en la línea donde ha establecido el punto de interrupción.

4. En la siguiente línea de código, hacer clic con el botón derecho en index y, a continuación, hacer clic en Agregar inspección. For index = 0 to names.GetLength(0) -1

Aparecerá una ventana Inspección debajo del Editor de código. El valor de la variable index se muestra en esta ventana Inspección.

5. Hacer clic con el botón derecho en la variable maxLen, y hacer clic en Agregar inspección.

Page 15: 8. Manejo de Errores

Manejo de errores y excepciones 13

6. Hacer clic con el botón derecho en la variable longestName y, a

continuación, hacer clic en Agregar inspección. 7. En la siguiente línea de código, seleccionar names(index), hacer clic con el

botón derecho en el área seleccionada y, a continuación, hacer clic en Agregar inspección. If names(index).Length > maxLen then

8. Pulsar F8.

La flecha amarilla indica la línea de código que se ejecutará a continuación. 9. Pulsar F8.

Debido a que la longitud del nombre Brandon es mayor que el valor actual de maxLen, la ejecución continúa en la siguiente línea.

10. Pulsar F8. Observar que el nombre más largo (longestName) de la ventana Inspección ahora contiene Brandon.

11. Pulsar F8. 12. Pulsar F8.

Observar que index se ha incrementado en 1. Sin embargo, la siguiente línea que se ejecuta es la instrucción If y no el bucle For. Esto se debe a que el bucle For ya se está ejecutando.

13. Pulsar F8. Aunque Bob es un nombre más corto que Brandon, la ejecución continúa en la siguiente línea. Esto se debe a que la variable maxLen no se ha actualizado y todavía contiene 0. Éste es el error del código.

14. Detener la aplicación pulsando MAYÚSCULAS+F5. 15. Después de la instrucción de código

longestName = names(index)

añadir la siguiente línea de código: maxLen = names(index).Length

16. Hacer clic en el marcador de punto de interrupción para eliminar el punto de

interrupción.

17. En la barra de herramientas, hacer clic en el botón Iniciar . 18. En el cuadro de diálogo Form1, hacer clic en Button1.

Ahora, el cuadro de mensaje informa correctamente de que el nombre más largo es Brandon.

19. En el cuadro de mensaje, hacer clic en OK. 20. Cerrar Form1. 21. En la barra de herramientas, hacer clic en Guardar todo.

Cerrar Visual Studio .NET

• En el menú Archivo, hacer clic en Salir.

Page 16: 8. Manejo de Errores

14 Manejo de errores y excepciones

¿Qué es el modo de interrupción?

Detiene la operación de una aplicación

En modo break, podemos:

Step through nuestro código línea por línea

Determinar los procedimientos activos que se han invocado

Observar los valores de las variables, propiedades y expresiones

Utilizar ventanas de depuración para cambiar los valores de variables y propiedades

Cambiar el flujo del programa

Ejecutar instrucciones de código

Introducción Cuando desarrollamos una aplicación en Visual Basic .NET, trabajamos principalmente en dos modos: modo de diseño y modo de ejecución. En el modo de diseño, creamos y modificamos código y podemos abordar errores de sintaxis, pero no podemos realizar pruebas para detectar errores de tiempo de ejecución y de lógica. En el modo de ejecución, podemos comprobar la ejecución del programa y realizar pruebas para detectar errores de tiempo de ejecución y de lógica, pero no podemos modificar el código. Un tercer modo (el modo de interrupción) detiene la operación de una aplicación y ofrece una imagen de su condición en cualquier momento. Entrar en el modo de interrupción no finaliza la ejecución del programa. La ejecución puede reanudarse en cualquier momento.

Únicamente podemos entrar modo de interrupción mientras estamos ejecutando una versión de debug de la aplicación. No podemos entrar modo de interrupción cuando estamos ejecutando una versión release de una aplicación.

Entrar en modo de interrupción

Visual Basic entra en modo de interrupción cuando:

Encuentra un punto de interrupción establecido en el código. Encuentra una instrucción Stop en el código. Se dispara una expresión de inspección que hayamos incluido. Pulsamos las teclas CTRL+BREAK mientras estamos ejecutando una

versión debug de nuestro programa. Hacemos clic en el botón Interrumpir todos de la barra de herramientas

Depurar mientras estamos ejecutando una versión debug de nuestro programa.

Una instrucción de una línea de código genera un error de tiempo de ejecución no atrapado y hacemos clic en Depurar en el cuadro de diálogo que aparece.

Una instrucción Debug.Assert se evalúa en False.

Page 17: 8. Manejo de Errores

Manejo de errores y excepciones 15

Estudiaremos más sobre la instrucción Debug.Assert más adelante en esta

unidad. Uso del modo de interrupción

Cuando estamos en modo de interrupción, el texto [interrumpir] aparece en la barra de título de Visual Studio. La siguiente imagen de pantalla muestra una aplicación denominada DebuggingApplication en modo de interrupción.

Mientras estamos en modo de interrupción, podemos:

Recorrer nuestro código línea a línea. Determinar los procedimientos activos que se han invocado. Observar los valores de variables, propiedades y expresiones. Utilizar las ventanas de depuración para cambiar valores de variables y

propiedades. Cambiar el flujo del programa. Ejecutar instrucciones de código.

Uso del método Debug.Assert

Podemos entrar condicionalmente en modo de interrupción utilizando el método Debug.Assert. Este método utiliza una expresión booleana para determinar si se entra en modo de interrupción. Se entra en el modo de interrupción cuando la instrucción Debug.Assert se evalúa a False.

Para emplear el método Debug.Assert, utilizar la siguiente sintaxis:

Debug.Assert booleanexpression

En el siguiente código, la instrucción Debug.Assert hará que Visual Basic entre en modo de interrupción cuando la variable Counter sea mayor o igual a cinco:

Private Sub Count_Click( ) Dim Counter As Integer For Counter = 1 To 10 Debug.Assert Counter < 5 'Enter break mode when this statement evaluates to False Next End Sub

Nota Únicamente podemos utilizar Debug.Assert en una versión de debug de

Page 18: 8. Manejo de Errores

16 Manejo de errores y excepciones

una aplicación. Cuando el código se compila utilizando una versión release, se omiten las invocaciones a métodos de Debug.

Page 19: 8. Manejo de Errores

Manejo de errores y excepciones 17

Cómo utilizar puntos de interrupción

Un breakpoint es un marcador en nuestro código que hace que Visual Basic detenga la ejecución del código en una línea específicaNo podemos colocar breakpoints en código no ejecutable

BreakpointsBreakpoints

Introducción Un punto de interrupción es un marcador en nuestro código que hace que Visual Basic detenga la ejecución del código en una línea específica. En lugar de recorrer nuestro código línea a línea o instrucción a instrucción, podemos permitir que nuestro programa se ejecute hasta que encuentre un punto de interrupción y empiece entonces la depuración.

Para detener nuestro programa en un lugar de nuestro código donde sospechamos que existe un problema, establecemos un punto de interrupción en ese lugar. Podemos establecer puntos de interrupción en tiempo de diseño o durante una sesión de depuración.

Establecer un punto de interrupción

Existen varias formas de establecer un punto de interrupción:

Hacer clic en el margen izquierdo del Editor de código en la línea que contiene la instrucción donde deseamos que se detenga el depurador.

Situar el cursor del ratón en la línea donde deseamos que se detenga el depurador. Pulsar F9 para cambiar el punto de interrupción a activo o inactivo.

Hacer clic con el botón derecho en la línea de código y, a continuación, hacer clic en Insertar punto de interrupción en el menú de acceso directo.

Una vez establecido el punto de interrupción, aparecerá un símbolo circular ( ) en el margen izquierdo de la línea de código en la que se ha establecido el punto de interrupción, y la línea de código aparece resaltada en el mismo color que el punto de interrupción.

Cuando se llega al punto de interrupción en tiempo de ejecución, aparece un indicador de ejecución en la línea que se ejecuta a continuación. Si lo deseamos,

Page 20: 8. Manejo de Errores

18 Manejo de errores y excepciones

podemos mover este indicador a otra línea. La siguiente ilustración muestra el indicador de ejecución.

Eliminar un punto de interrupción

Existen varias formas de eliminar un punto de interrupción:

Hacer clic en el símbolo del punto de interrupción ( ) junto a la línea que contiene el punto de interrupción, en el margen izquierdo del Editor de código.

Situar el cursor en la línea en la que se ha establecido el punto de interrupción y, a continuación, pulsar F9 para eliminar el punto de interrupción.

Hacer clic con el botón derecho en la línea de código en la que se ha establecido el punto de interrupción y, a continuación, hacer clic en Deshabilitar punto de interrupción en el menú de acceso directo.

Para eliminar todos los puntos de interrupción al mismo tiempo, hacer clic en Borrar todos los puntos de interrupción en el menú Depurar. Nota

La ventana Puntos de interrupción

La ventana Puntos de interrupción muestra una lista de todos los puntos de interrupción establecidos actualmente en nuestro programa y sus propiedades. En la ventana Puntos de interrupción, podemos establecer nuevos puntos de interrupción, eliminar, habilitar o deshabilitar puntos de interrupción, modificar las propiedades de un punto de interrupción, o ir al código fuente o desensamblar el código correspondiente al punto de interrupción.

Abrir la ventana Puntos de interrupción

• En el menú Depurar, seleccionar Ventanas y, a continuación, hacer clic en Puntos de interrupción.

La siguiente imagen de pantalla muestra la ventana Puntos de interrupción.

Si se desea obtener más información sobre el uso de la ventana Puntos de interrupción, consultar Uso de la ventana Puntos de interrupción en la documentación de Visual Studio .NET.

Nota

Page 21: 8. Manejo de Errores

Manejo de errores y excepciones 19

Cómo modificar puntos de interrupción

Propiedad ConditionPropiedad Condition

PropiedadHit Count

PropiedadHit Count

Introducción Podemos establecer dos propiedades que modifiquen el comportamiento de un punto de interrupción: la propiedad Condición y la propiedad Recuento de visitas.

Uso de la propiedad Condición

Podemos utilizar el cuadro de diálogo Propiedades del punto de interrupción para establecer un punto de interrupción condicional. Una condición es una expresión que determina si el depurador entrará en modo de interrupción cuando llegue al punto de interrupción. Cuando el depurador llegue al punto de interrupción, evaluará la condición y cambiará a modo de interrupción sólo si ésta se cumple.

Establecer la propiedad Condición Establecer la propiedad Condición para un punto de interrupción

1. En el menú Depurar, seleccionar Ventanas y, a continuación, hacer clic en Puntos de interrupción.

2. Abrir el cuadro de diálogo Propiedades del punto de interrupción haciendo clic en el punto de interrupción adecuado de la ventana Puntos de interrupción y hacer clic en Propiedades en la barra de herramientas de la ventana Puntos de interrupción.

3. En el cuadro de diálogo Propiedades del punto de interrupción, hacer clic en Condición.

4. Escribir la expresión que desea que evalúe el depurador. 5. Especificar cómo debe satisfacerse la condición escogiendo uno de los

siguientes: a. Cuando la expresión es true. b. Cuando el valor de la expresión cambia (hacer clic en ha cambiado en

el cuadro de diálogo Condición de punto de interrupción). Cuando establecemos una condición de punto de interrupción que evalúa si una expresión ha cambiado, el depurador no se detiene la primera vez que se llega al punto de interrupción. La expresión se evalúa y se

Page 22: 8. Manejo de Errores

20 Manejo de errores y excepciones

almacena un valor, pero este almacenamiento inicial no se considera un cambio en el valor.

Ejemplo de uso de la propiedad Condición

Por ejemplo, supongamos que estamos depurando un programa financiero en el que no está permitido que el saldo de la cuenta sea menor que cero. Podríamos establecer puntos de interrupción en determinados lugares del código y asignar la condición accountBalance < 0 a cada uno.

Cuando ejecutamos el programa, la ejecución se interrumpirá en los puntos de interrupción sólo cuando la variable accountBalance sea menor que cero. Podemos examinar el estado del programa y las variables en el primer lugar del punto de interrupción, y continuar la ejecución hasta el segundo lugar de punto de interrupción, etc. La siguiente imagen de pantalla muestra cómo se establecería la propiedad Condición del punto de interrupción para el escenario anterior.

Uso de la propiedad Recuento de visitas

De modo predeterminado, el depurador detiene la ejecución del código cada vez que se llega a un punto de interrupción. No obstante, algunos errores no aparecen la primera vez que nuestro programa ejecuta un bucle, invoca una función o accede a una variable. Por ello, es posible que deseemos detener la ejecución sólo cuando se haya llegado al punto de interrupción un número específico de veces. Este número se denomina recuento de visitas. Podemos utilizar la propiedad Recuento de visitas para especificar cuántas veces se alcanza el punto de interrupción antes de que el depurador detenga su ejecución.

Establecer la propiedad Recuento de visitas Establecer la propiedad Recuento de visitas de un punto de

interrupción

6. En el menú Depurar, seleccionar Ventanas y, a continuación, hacer clic en Puntos de interrupción.

7. Abrir el cuadro de diálogo Propiedades del punto de interrupción seleccionando el punto de interrupción adecuado en la ventana Puntos de interrupción y haciendo clic en Propiedades en la barra de herramientas de la ventana Puntos de interrupción.

8. En el cuadro de diálogo Propiedades del punto de interrupción, hacer clic en Recuento de visitas.

9. En el cuadro de diálogo Recuento de visitas al punto de interrupción, en el cuadro Cuando el punto de interrupción se visita, hacer clic en el tipo de prueba de recuento de visitas que desea realizar. Las opciones disponibles son las siguientes: a. interrumpir siempre b. interrumpir cuando el recuento de visitas es igual a

Page 23: 8. Manejo de Errores

Manejo de errores y excepciones 21

c. interrumpir cuando el recuento de visitas es múltiplo de

d. interrumpir cuando el recuento de visitas es mayor o igual a 10. Introduzca el valor del recuento de visitas adecuado y, a continuación, hacer

clic en Aceptar. Ejemplo de uso de la propiedad Recuento de visitas

En el siguiente ejemplo, el recuento de visitas se ha establecido en 3. La ejecución se detendrá la tercera vez que se alcance el punto de interrupción. Si ha establecido una propiedad Condición, la ejecución se detendrá la tercera vez que se alcance el punto de interrupción según esa condición.

Page 24: 8. Manejo de Errores

22 Manejo de errores y excepciones

La barra de herramientas Depurar

StartStart

Break AllBreak All

Stop Debugging

Stop Debugging

RestartRestart

Show NextStatement

Show NextStatement

Step IntoStep Into Step OutStep Out

Step OverStep Over

BreakpointsBreakpoints

HexadecimalDisplay

HexadecimalDisplay

Introducción Después de que la ejecución de su programa se haya detenido cerca de un punto donde pensamos que existe un problema, podemos utilizar las herramientas de depuración que proporciona Visual Basic para investigar el problema. La barra de herramientas Depurar ofrece un acceso rápido a varias de las características de depuración más utilizadas.

La barra de herramientas Depurar

Si la barra de herramientas Depurar no está visible, hacer clic con el botón derecho en cualquier barra de herramientas en modo de diseño o interrupción y, a continuación, hacer clic en Depurar. La siguiente tabla describe los botones de la barra de herramientas que utilizaremos con mayor frecuencia.

Nombre del botón Acceso directo predeterminado

Descripción

Iniciar/Continuar F5 Ejecuta la aplicación desde el formulario de inicio (o Sub Main) especificado en

la pestaña General del cuadro de diálogo Páginas de propiedades. En modo de interrupción, el texto del la sugerencia del botón Iniciar cambia a Continuar.

Interrumpir todos CTRL+ALT+BREAK

Detiene la ejecución de todos los programas que se ejecutarán bajo el depurador. Los programas no se cierran y podemos reanudar su ejecución cuando deseemos.

Detener depuración Detiene la ejecución del programa y regresa al modo de diseño.

Paso a paso por instrucciones

F8 Ejecuta la siguiente línea de código ejecutable, yendo paso a paso por cada una de las líneas de código siguientes. Si el código invoca otro procedimiento, Paso a paso por instrucciones se ejecuta paso a paso por cada línea de ese procedimiento.

Paso a paso por procedimientos

MAYS+F8 Ejecuta la siguiente línea de código ejecutable, yendo paso a paso por cada una de las líneas de código siguientes. Si el código invoca otro procedimiento, ese procedimiento se ejecuta completamente antes de ir paso a paso por la siguiente línea de código del primer procedimiento.

Paso a paso para salir CTRL+MAYS+F8 Ejecuta el resto del procedimiento actual y se interrumpe en la siguiente línea del procedimiento de llamada.

Puntos de interrupción

CTRL+B Abre la ventana Puntos de interrupción.

Page 25: 8. Manejo de Errores

Manejo de errores y excepciones 23

Cómo recorrer el código

Step into o step over: ejecuta la línea de código siguiente. Si la línea siguiente contiene una invocación de procedimiento:

Step into: únicamente ejecuta la invocación, y se detiene en la primera línea de código dentro del procedimiento

Step over: ejecuta el procedimiento, y se detiene en la primera línea de código fuera del procedimiento

Step out: reanuda la ejecución hasta que regresa el procedimiento y, a continuación, se interrumpe en el punto de regreso del procedimiento de llamada

Run To Cursor: el depurador ejecuta nuestra aplicación hasta llegar al punto de inserción que hemos establecido

Introducción Uno de los procedimientos de depuración más habituales es recorrer paso a paso el código, o ejecutar las líneas del código una por una. El menú Depurar proporciona tres comandos para recorrer paso a paso el código: Paso a paso por instrucciones, Paso a paso por procedimientos y Paso a paso para salir. Además, el comando Ejecutar hasta el cursor nos permite ejecutar nuestra aplicación hasta que el depurador llega al punto de inserción que hemos establecido. Podremos ir paso a paso por nuestro código desde ese punto.

No podemos acceder a los comandos Step si nuestra aplicación se está ejecutando. Los comandos Step únicamente son válidos en modo de interrupción o antes de iniciar la aplicación.

Nota

Uso de Paso a paso por instrucciones y Paso a paso por procedimientos

Tanto Paso a paso por instrucciones como Paso a paso por procedimientos ordenan al depurador que ejecute la siguiente línea de código. Estos comandos sólo se diferencian en un aspecto: la forma en que controlan las invocaciones a procedimientos.

Si la línea contiene una invocación a un procedimiento:

Paso a paso por instrucciones únicamente ejecuta la invocación, y se detiene en la primera línea de código dentro del procedimiento.

Paso a paso por procedimientos ejecuta todo el procedimiento, y se detiene en la primera línea de código fuera del procedimiento.

Utilizar Paso a paso por instrucciones si se desea ver la invocación a procedimiento. Utilizar Paso a paso por procedimientos si se desea evitar ir paso a paso dentro de los procedimientos.

Page 26: 8. Manejo de Errores

24 Manejo de errores y excepciones

Uso de Paso a paso para salir

Utilizar Paso a paso para salir cuando nos encontremos dentro de la invocación a un procedimiento y se desee regresar al procedimiento de llamada. Paso a paso para salir reanuda la ejecución de código hasta el retorno del procedimiento, y se interrumpe en el punto de retorno del procedimiento de llamada.

Uso de Ejecutar hasta el cursor

Podemos utilizar el comando Ejecutar hasta el cursor para ordenar al depurador que ejecute nuestra aplicación hasta alcanzar el punto de inserción que hemos establecido haciendo clic en el Editor de código con el ratón. El comando Ejecutar hasta el cursor no está disponible en el menú Depurar. Para ejecutar este comando, hacer clic con el botón derecho en la ventana fuente y, a continuación, hacer clic en Ejecutar hasta el cursor en el menú de acceso directo.

Iniciar la acción de ir paso a paso por el código

Para iniciar la depuración de una aplicación, podemos utilizar Iniciar, Paso a paso por instrucciones, Paso a paso por procedimientos o Ejecutar hasta el cursor.

Si hacemos clic en Iniciar, nuestra aplicación se iniciará y se ejecutará hasta llegar a un punto de interrupción. Podemos interrumpir la ejecución en cualquier momento para examinar valores, modificar variables, y examinar el estado de nuestro programa.

Si hacemos clic en Paso a paso por instrucciones o Paso a paso por procedimientos, nuestra aplicación se interrumpirá en la primera línea de código ejecutable.

Si hacemos clic en Ejecutar hasta el cursor, nuestra aplicación se iniciará y se ejecutará hasta llegar a un punto de interrupción o al lugar del punto de inserción, lo que ocurra antes. En algunos casos, no se produce una interrupción. Esto significa que la ejecución no llega en ningún momento a la línea de código en la que se ha establecido el punto de inserción.

Page 27: 8. Manejo de Errores

Manejo de errores y excepciones 25

Demostración: Cómo utilizar las ventanas de depuración

En esta demostración, aprenderemos a depurar una aplicación utilizando:

Las ventanas Autos, Locals, Watch, y Command

Breakpoints

El comando Run To Cursor

En esta demostración, aprenderemos a depurar una aplicación utilizando las ventanas Automático, Variables locales, Inspección y Comandos, Puntos de interrupción, y el comando Ejecutar hasta el cursor.

Iniciar Visual Studio .NET y cargar el proyecto de la demostración

1. Hacer clic en Inicio, seleccionar Todos los programas, seleccionar Microsoft Visual Studio .NET y, a continuación, hacer clic en Microsoft Visual Studio .NET.

2. En la Página de inicio, en el panel de Inicio, hacer clic en Abrir proyecto. 3. En el cuadro de diálogo Abrir proyecto, abrir la carpeta

DebuggingApplication2, y hacer doble clic en DebuggingApplication2.sln. Esta carpeta se puede encontrar dentro del fichero demos08.zip.

Utilizar el comando Ejecutar hasta el cursor

1. En el Explorador de soluciones, hacer clic con el botón derecho en Form1.vb y, a continuación, hacer clic en Ver código.

2. En el Editor de código, en el código del evento Form1_Load, hacer clic con el botón derecho en la siguiente línea y, a continuación, clic en Ejecutar hasta el cursor. names(0)= "Brandon"

Observar que se inicia la aplicación, y la ejecución se detiene en la línea especificada.

Uso de la ventana Automático

1. Examine la ventana Automático. Si esta ventana no está visible, hacer clic en el menú Depurar, seleccionar Ventana y, a continuación, hacer clic en Automático. Observar que la matriz names se encuentra vacía.

Page 28: 8. Manejo de Errores

26 Manejo de errores y excepciones

2. En la barra de herramientas Depurar, hacer clic en Paso a paso por instrucciones. Observar que names(0) ahora contiene el nombre Brandon.

3. En la barra de herramientas Depurar, hacer clic en Paso a paso por instrucciones. Observar que names(1) contiene el nombre Bob. La ventana Automático muestra las variables de código de la instrucción actual y el código de la instrucción anterior.

Uso de la ventana Variables locales

1. Examinar la ventana Variables locales. Si esta ventana no está visible, hacer clic en el menú Depurar, seleccionar Ventanas y, a continuación, hacer clic en Variables locales. La ventana Variables locales muestra las variables locales al contexto actual.

2. En la ventana Variables locales, expandir Me. 3. En Me, expandir names.

Uso de la ventana Inspección

4. Examinar la ventana Inspección 1. Si esta ventana no está visible, hacer clic en el menú Depurar, seleccionar Ventanas, seleccionar Inspección y, a continuación, hacer clic en Inspección 1.

5. En el Editor de código, hacer clic con el botón derecho en names(0) y, a continuación, hacer clic en Agregar inspección. Las ventanas de inspección nos permiten crear nuestra propia lista personalizada de las variables que deseamos monitorizar mientras se ejecuta el código.

6. En el Editor de código de Form1.vb, en la función Sub Button1_Click, hacer clic con el botón derecho en maxLen y, a continuación, hacer clic en Agregar inspección. Observar que el valor maxLen se muestra como Nombre 'maxLen' no está declarado. Esto se debe a que el código que declara maxLen no se ha ejecutado todavía.

7. En el Editor de código de Form1.vb, en la función Sub Button1_Click, hacer clic con el botón derecho en la instrucción For y, a continuación, hacer clic en Ejecutar hasta el cursor.

8. En el cuadro de diálogo Form1, hacer clic en Button1. La ejecución se detiene en la instrucción For en el código del evento Button1_Click. Examine la ventana Inspección 1 y observar que el valor de maxLen ahora es 0. Observar también, en la ventana Variables locales, que los valores contenidos para los elementos 2 hasta 4 en la matriz names se muestran en rojo. Estos valores están en rojo porque han cambiado desde la última vez que la aplicación se depuró.

Uso de puntos de interrupción y de la ventana Comandos

Page 29: 8. Manejo de Errores

Manejo de errores y excepciones 27

1. En el Editor de código de Form1.vb, en la función Sub Button1_Click,

hacer clic con el botón derecho en la siguiente línea de código y, a continuación, hacer clic en Insertar punto de interrupción. If names(index).Length > maxLen Then

2. En el menú Depurar, seleccionar Ventanas y hacer clic en Puntos de

interrupción. 3. En la ventana Puntos de interrupción, hacer clic con el botón derecho en la

entrada de punto de interrupción y hacer clic en Propiedades. 4. En la ventana Propiedades de punto de interrupción, en la ficha Archivo,

hacer clic en Condición. Las condiciones le permiten detener la ejecución en la línea del punto de interrupción cuando se cumple una determinada condición.

5. En la ventana Condición de punto de interrupción, en Condición, escribir index=3 y hacer clic en Aceptar.

6. En la ventana Propiedades de puntos de interrupción, hacer clic en Aceptar.

7. Hacer clic en el botón Continuar de la barra de herramientas. La ejecución se detiene en la línea del punto de interrupción.

8. En el menú Depurar, seleccionar Ventanas y hacer clic en Inmediato. La Ventana de comandos soporta dos modos distintos: modo Comando y modo Inmediato. Podemos utilizar el modo Comando para ejecutar comandos de Visual Studio .NET directamente en el entorno de desarrollo, obviando el sistema del menús. Podemos utilizar el modo Inmediato cuando depuramos una aplicación. Utilizar el modo Inmediato para evaluar expresiones, ejecutar instrucciones, mostrar valores de variables, etc.

9. En la Ventana de comandos, escribir ?index y pulsar ENTER. El valor 3 se muestra en la ventana. Esto confirma que se ha producido el punto de interrupción condicional.

10. En la Ventana de comandos, escribir names(4)=“Christopher” y pulsar ENTER.

11. En la Ventana de comandos, escribir ?names(4) y pulsar ENTER. La cadena Christopher aparece en la ventana. Esto demuestra que podemos utilizar la Ventana de comandos para cambiar el valor de variables.

12. Hacer clic en el botón Continuar de la barra de herramientas. Observar que el cuadro de mensaje ahora informa de que Christopher es el nombre más largo de la matriz names.

13. En el cuadro de mensaje, hacer clic en Aceptar. 14. Cerrar Form1.

Cerrar Visual Studio .NET

• En el menú Archivo, hacer clic en Salir.

Page 30: 8. Manejo de Errores

28 Manejo de errores y excepciones

Cómo utilizar las ventanas de depuración

VentanaVentanaVentana Utilice esta ventana para…Utilice esta ventana Utilice esta ventana parapara……

AutosAutosVer variables en la instrucción actual y tres instrucciones antes y después de la instrucción actual

Ver variables en la instrucción actual y tres instrucciones antes y después de la instrucción actual

Call StackCall Stack Ver el histórico de llamadas a la línea de código que se está depurandoVer el histórico de llamadas a la línea de código que se está depurando

LocalsLocals Ver y modificar variables locales Ver y modificar variables locales

WatchWatchCrear una lista personalizada de variables y expresiones que monitorizar Ver y manipular cualquier expresión watch

Crear una lista personalizada de variables y expresiones que monitorizar Ver y manipular cualquier expresión watch

Introducción El depurador de Visual Studio .NET dispone de diversas ventanas que nos permiten inspeccionar nuestro programa en detalle y modificar su estado. Las ventanas Automático, Pila de llamadas, Variables locales e Inspección son las ventanas de depuración que probablemente más utilizaremos.

Uso de la ventana Automático

Podemos utilizar la ventana Automático para visualizar variables en la instrucción actual y tres instrucciones anteriores y posteriores a la instrucción actual. La instrucción actual es la instrucción en el lugar de ejecución actual (la instrucción que se ejecutará a continuación si la ejecución continúa). También podemos utilizar la ventana Automático para modificar el valor de una variable.

Modificar el valor de una variable utilizando la ventana Autos

1. En el menú Depurar, seleccionar Ventanas y, a continuación, hacer clic en Automático.

2. En la columna de valores, hacer doble clic en el valor que desea cambiar. 3. Escribir el nuevo valor y pulsar ENTER.

Uso de la ventana Pila de llamadas

Podemos utilizar la ventana Pila de llamadas para ver el histórico de llamadas de la línea de código que se está depurando, incluyendo cualquier tipo de parámetros y valores de parámetros. Se denomina pila de llamadas (call stack) a la serie de procedimientos invocados dentro de una aplicación.

Ver el código fuente de un procedimiento en la pila de llamadas

1. En el menú Depurar, seleccionar Ventanas y, a continuación, hacer clic en Pila de llamadas.

2. En la ventana Pila de llamadas, hacer clic con el botón derecho en el procedimiento cuyo código fuente desea ver y, a continuación, hacer clic en Ir a código fuente en el menú de acceso directo.

Page 31: 8. Manejo de Errores

Manejo de errores y excepciones 29

La ventana Pila de llamadas muestra el nombre de cada procedimiento y el

lenguaje de programación en el que está escrito. El nombre del procedimiento puede estar acompañado de información opcional, como el nombre del módulo, número de línea, byte offset y nombres, tipos y valores de parámetros. La visualización de esta información opcional puede activarse o desactivarse.

Cambiar la información opcional mostrada en la ventana Pila de llamadas

1. En el menú Depurar, seleccionar Ventanas y, a continuación, hacer clic en Pila de llamadas.

2. Hacer clic con el botón derecho en la ventana Pila de llamadas y seleccionar o deseleccionar Mostrar la información deseada en el menú de acceso directo.

Uso de la ventana Variables locales

Podemos utilizar la ventana Variables locales para visualizar y modificar variables locales al contexto actual. Esta ventana proporciona información explícita sobre objetos, como información sobre herencia.

Modificar el valor de una variable utilizando la ventana Variables locales

1. En el menú Depurar, seleccionar Ventanas y, a continuación, hacer clic en Variables locales.

2. En la ventana Variables locales, hacer doble clic en el valor que desea modificar.

3. Escribir el nuevo valor y pulsar ENTER.

La ventana Variables locales muestra todas las variables en el contexto actual y, por ello, es posible que no sea la ventana ideal para concentrar varias variables específicas. Para monitorizar únicamente las variables que especifiquemos, es mejor utilizar la ventana Inspección.

Uso de la ventana Inspección

Podemos utilizar la ventana Inspección para crear nuestra propia lista personalizada de variables o expresiones a monitorizar mientras el código se ejecuta. Podemos ver y manipular cualquier expresión a inspeccionar en la ventana Inspección.

Agregar una variable a la ventana Inspección

• Hacer clic con el botón derecho en la variable del Editor de código y, a continuación, hacer clic en Agregar inspección.

Evaluar una variable o expresión utilizando la ventana Inspección

1. En el menú Depurar, seleccionar Ventanas, hacer clic en Inspección y, a continuación, en Inspección 1.

2. En la ventana Inspección, hacer clic en una fila vacía en la columna Nombre.

3. Escribir o pegar la variable o expresión en la fila seleccionada. 4. Pulsar ENTER. El resultado aparece en la columna de valores.

Si hemos escrito el nombre de una matriz o variable de objeto, aparecerá un control en árbol junto al nombre en la columna Nombre. Hacer clic en más (+) o menos (-) en la columna Nombre para expandir o colapsar la variable.

Page 32: 8. Manejo de Errores

30 Manejo de errores y excepciones

5. La expresión permanecerá en la ventana Inspección hasta que la eliminemos.

¿Ventana Inspección o cuadro de diálogo Inspección rápida?

El depurador de Visual Studio .NET proporciona un cuadro de diálogo modal denominado Inspección rápida que ofrece una forma rápida de evaluar o modificar una sola variable o expresión. Debido a que Inspección rápida es modal, no podemos dejarlo abierto para inspeccionar una variable o expresión mientras vamos recorriendo nuestro programa. Si deseamos inspeccionar una variable o expresión mientras recorremos nuestro programa, agregaremos esa variable o expresión a la ventana Inspección. No obstante, si simplemente deseamos realizar un cálculo rápido que implique una o más variables, podemos utilizar Inspección rápida.

Manipular una variable utilizando Inspección rápida

• En modo de interrupción, en una ventana fuente, hacer clic con el botón derecho en un nombre de variable y clic en Inspección rápida en el menú de acceso directo. De ese modo, la variable se ubicará automáticamente en el cuadro de diálogo Inspección rápida.

Page 33: 8. Manejo de Errores

Manejo de errores y excepciones 31

Cómo utilizar la Ventana de comandos

Utilice la ventana Comando para: Issue comandos (modo Comando)Depurar y evaluar expresiones (modo Inmediato)

TareaTareaTarea SoluciónSoluciSolucióónn EjemploEjemploEjemplo

Evaluar expresionesEvaluar expresiones Encabezar la expresión con un signo de interrogación (?)

Encabezar la expresión con un signo de interrogación (?) ?myVariable?myVariable

Cambiar a modo Inmediatodesde modo Comando

Cambiar a modo Inmediatodesde modo Comando

Escribir immed en la ventana, sin el signo mayor que (>)

Escribir immed en la ventana, sin el signo mayor que (>) immedimmed

Regresar a modo Comando desde modo Inmediato

Regresar a modo Comando desde modo Inmediato Escribir >cmd en la ventanaEscribir >cmd en la ventana >cmd>cmd

Entrar temporalmente en modo Comando desde modo Inmediato

Entrar temporalmente en modo Comando desde modo Inmediato

Escribir el comando, precedido del signo mayor que (>)

Escribir el comando, precedido del signo mayor que (>)

>alias >alias

Introducción La Ventana de comandos no es una ventana de depuración, pero puede resultar útil en la depuración del código. Podemos utilizarla para invocar comandos (modo Comando) o para depurar y evaluar expresiones (modo Inmediato).

Uso de la Ventana de comandos Abrir la Ventana de comandos

• En el menú Ver, seleccionar Otras ventanas y, a continuación, hacer clic en Ventana de comandos.

La siguiente tabla describe varios comandos que podemos utilizar en la Ventana de comandos.

Tarea Solución Ejemplo

Evaluar expresiones Encabezar la expresión con un signo de interrogación (?)

?miVariable

Cambiar a modo Inmediato desde modo Comando

Escribir immed en la ventana, sin el signo mayor que (>)

immed

Regresar a modo Comando desde modo Inmediato

Escribir >cmd en la ventana >cmd

Entrar temporalmente en modo Comando mientras estamos en modo Inmediato (para ejecutar un comando)

Escribir el comando en la ventana, precedido del signo mayor que (>)

>alias

Debemos incluir el signo mayor que (>) cuando invocamos comandos de Visual Studio .NET estando en modo Inmediato. Los comandos escritos en modo Comando no van precedidos del signo mayor que.

Nota

Page 34: 8. Manejo de Errores

32 Manejo de errores y excepciones

Práctica: Código de depuración

Examine el código en el controlador de eventos Click

Genere y ejecute la aplicación

Proponga una forma de solucionar el error

Utilice las herramientas de depuración para localizar el error lógico

En esta práctica, trabajaremos el proceso de depurar una aplicación sencilla. Para localizar el error lógico de un programa, estableceremos un punto de interrupción, recorreremos el código y utilizaremos la ventana de comandos para comprobar los valores almacenados en las variables mientras nuestro código se ejecuta en modo de interrupción. Sugeriremos cómo podría solucionarse el error lógico, e implementaremos una posible solución para el error.

Abrir el proyecto

• Abrir el proyecto DebugApplication.sln, que se encuentra en la carpeta Starter dentro del fichero practs08.zip. Esta aplicación calcula el número de palabras de una frase. El usuario escribe una frase en un cuadro de texto de un formulario y hace clic en un botón; a continuación, aparece un cuadro de mensaje informando al usuario de cuantas palabras contiene la frase que se ha escrito. La siguiente imagen muestra la aplicación que se está ejecutando.

Page 35: 8. Manejo de Errores

Manejo de errores y excepciones 33

Examinar el controlador de eventos NumberOfWords_Click

• Abrir el controlador de eventos NumberOfWords_Click, y examinar el código para entender cómo se ha generado la aplicación para que responda a las funcionalidades previstas. Responder a las siguientes preguntas sobre el código. a. Observar las declaraciones de la variable. ¿Cómo se asignará su valor a

la variable sentence? ¿Para qué se utiliza la función Trim? La cadena introducida por el usuario en InputTextBox se asignará a la variable sentence. La función Trim elimina los espacios al principio y al final de la cadena. _________________________________________________________

_________________________________________________________

b. Explicar el funcionamiento del código que asigna inicialmente un valor a location. Observar que el término Chr(32) en la declaración constante para spaceDelimeter hace referencia al carácter de espacio en blanco. La función InStr buscará un carácter de espacio en la cadena de la frase, empezando por el primer carácter. Si encuentra un carácter de espacio, asignará la posición del carácter a location. Si no encuentra un carácter de espacio, la función devolverá un valor 0. _________________________________________________________

_________________________________________________________

c. ¿Qué condición impedirá que el bucle While se repita? Si no hay ningún carácter de espacio, el valor de location será 0. Cuando el valor de location es 0, el código del bloque While no se ejecuta. La ejecución del código seguirá hasta el bloque If…Then. _________________________________________________________

_________________________________________________________

d. ¿Para qué se utiliza la variable wordCount? La variable wordCount almacena el número total de palabras de la frase. _________________________________________________________

_________________________________________________________

e. ¿Para qué se asigna un nuevo valor a location en el bucle While? ¿Por qué la asignación de ubicación utilizando la función InStr sucede de nuevo? Después de que cada espacio haya sido encontrado, es necesario ejecutar una búsqueda de más espacios. Este código busca incidencias adicionales del carácter de espacio más allá de cualquier incidencia que ya se haya contado. _________________________________________________________

_________________________________________________________

Page 36: 8. Manejo de Errores

34 Manejo de errores y excepciones

f. Describir el flujo de código que podríamos esperar si un usuario escribiera la palabra “Test” sin espacios en InputTextBox. ¿Qué valor devolvería el cuadro de mensaje? Debido a que no hay espacios en el texto introducido por el usuario, el valor de location se establecerá a 0. El bucle While evaluará el valor de location, y como el valor es 0, la ejecución de código pasará al bloque de código If…Then. La longitud de sentence no es igual a 0, por tanto, wordCount se incrementará de 0 a 1 en el bloque If…Then. El cuadro de mensaje mostrará el mensaje “Total number of words 1.” __________________________________________________________

__________________________________________________________

g. Describir el flujo de código que podríamos esperar si un usuario escribiera las palabras “Test Me” en InputTextBox. ¿Qué valor devolvería el cuadro de mensaje? Debido a que hay un espacio en la posición 5 en el texto introducido por el usuario, el valor de location se establecerá en 5. El bucle While evaluará el valor de location e incrementará wordCount de 0 a 1. Debido a que no hay espacios en el texto restante, el valor de location se reinicializará en 0. El bucle While evaluará el nuevo valor de location, y como el valor ahora es 0, la ejecución del código pasará al bloque de código If…Then. La longitud de sentence no es igual a 0, por tanto, wordCount se incrementará de 1 a 2 en el bloque If…Then. El cuadro de mensaje mostrará el mensaje “Total number of words 2.” __________________________________________________________

__________________________________________________________

Comprobar las respuestas antes de continuar con la práctica. Para revisar las respuestas, podemos utilizar las que se proporcionan en el material del estudiante, comparar las respuestas con otro estudiante o mostrarlas al profesor. Para revisar las respuestas de las dos últimas preguntas, también podemos establecer un punto de interrupción al principio del bucle While y utilizar el comando Paso a paso por instrucciones (F8) para movernos paso a paso por el código.

Nota

Page 37: 8. Manejo de Errores

Manejo de errores y excepciones 35

Generar y ejecutar la aplicación

1. Ejecutar la aplicación en modo de depuración. 2. En el cuadro Enter a sentence, escribir la palabra Test y hacer clic en Total

Words. El cuadro de mensaje debería mostrar 1, el número correcto de palabras. Hacer clic en OK.

3. En el cuadro Enter a sentence, escribir la frase Test me y hacer clic en Total Words. El cuadro de mensaje debería mostrar 2, el número correcto de palabras de la frase. Hacer clic en OK.

4. Modificar la frase existente en el cuadro Enter a sentence añadiendo espacios entre las dos palabras.

5. Hacer clic en Total Words. Aparecerá un número incorrecto de palabras en el cuadro de mensaje. Hacer clic en OK.

Localizar el código que provoca el error

1. Para localizar el error lógico de esta aplicación, considerar las siguientes cuestiones: a. ¿Qué entrada del usuario causa este error?

El error ocurre cuando un usuario escribe varios caracteres de espacio en blanco entre dos palabras consecutivas. _________________________________________________________

_________________________________________________________

b. ¿Qué herramientas de depuración podríamos utilizar para localizar el código que causa el error? Respuesta posible: establecer un punto de interrupción en el controlador de eventos, ejecutar la aplicación y utilizar el comando Paso a paso por instrucciones para recorrer paso a paso las líneas del código una a una. Utilizar la ventana Automático para examinar los valores de la variable y determinar cuándo ocurre el error. _________________________________________________________

_________________________________________________________

2. En el controlador de eventos NumberOfWords_Click, en la línea de código que inicia el bucle While, establecer un punto de interrupción.

3. Ejecutar la aplicación. En el cuadro Enter a sentence, escribir Test Me con espacios adicionales entre las dos palabras y, a continuación, hacer clic en el botón Total Words.

Page 38: 8. Manejo de Errores

36 Manejo de errores y excepciones

4. Utilizar el comando Paso a paso por instrucciones (F8) para recorrer paso a paso las líneas del código. A medida que recorremos el código, utilizar la ventana Automático para examinar los valores de la variable y determinar cuándo ocurre el error. Puede utilizar las siguientes preguntas como ayuda para localizar el error lógico: a. ¿Cuál es el valor de location durante la primera repetición del bucle

While? 5. __________________________________________________________

__________________________________________________________

b. ¿Incrementa el valor de wordCount adecuadamente después de que se encuentre el primer espacio? Sí. __________________________________________________________

__________________________________________________________

c. ¿Cuál es el valor de location cuando el valor de wordCount cambia a 2? 6. __________________________________________________________

__________________________________________________________

d. ¿Cuántas palabras se han contado realmente si el valor actual de location es 6? Una. __________________________________________________________

__________________________________________________________

e. Describir el problema de este código y proponer una forma para corregir el error. El código del bucle While utiliza la presencia de un carácter de espacio en la cadena sentence como indicativo de que hay una palabra que debe contarse. Esta lógica no tiene en cuenta la posible presencia de dos o más caracteres de espacio entre dos palabras consecutivas. El siguiente procedimiento describe una forma para corregir el error. __________________________________________________________

__________________________________________________________

Page 39: 8. Manejo de Errores

Manejo de errores y excepciones 37

Corregir el error lógico

Una forma de solucionar el problema de este código es eliminar cada palabra después de que sea contada y, a continuación, eliminar los espacios desde el principio de la cadena restante. La variable sentence es un tipo de datos String, y proporciona el método Remove para eliminar caracteres de una cadena. El siguiente código muestra cómo utilizar el método Remove y la función LTrim para solucionar el error: sentence = LTrim(sentence.Remove(0, location))

Debido a que eliminamos una palabra de la cadena con el código anterior, también necesitamos modificar la invocación a la función InStr del bucle While y establecer la posición de inicio en 1 cada vez que el código se ejecute. • Corregir el código del controlador de eventos NumberOfWords_Click. El

código corregido debería ser similar al siguiente: While location < > 0 wordCount += 1 sentence = LTrim(sentence.Remove(0, location)) location = InStr(1, sentence, spaceDelimeter) End While

Probar la aplicación

• Ejecutar y probar la aplicación en modo de depuración.

Archivos de solución Los archivos de solución se encuentran en la carpeta Solution dentro del fichero practs08.zip.

Page 40: 8. Manejo de Errores

38 Manejo de errores y excepciones

Lección: Gestión de excepciones

La clase Exception

¿Qué es la gestión estructurada de excepciones?

Cómo utilizar la instrucción Try…Catch

Cómo utilizar el bloque Finally

Cómo lanzar excepciones

Directrices para el uso de la gestión estructurada de excepciones

Introducción Visual Basic soporta la gestión estructurada de excepciones. La gestión estructurada de excepciones proporciona una forma de controlar los errores que puedan producirse en un bloque de código, permitiendo al mismo tiempo que nuestra aplicación se ejecute. Con el uso de la gestión estructurada de excepciones en nuestra aplicación, podemos prever errores potenciales e impedir que interfieran en el uso previsto de nuestra aplicación.

En esta lección, estudiaremos cómo implementar la gestión estructurada de excepciones en Visual Basic .NET, y cuándo utilizar este método de gestión de errores.

Estructura de la lección Esta lección incluye los siguientes temas y actividades:

La clase Exception ¿Qué es la gestión estructurada de excepciones? Cómo utilizar la instrucción Try…Catch Cómo utilizar el bloque Finally Cómo lanzar excepciones Directrices para el uso de la gestión estructurada de excepciones Demostración: uso de la gestión estructurada de excepciones

Objetivos de la lección En esta lección, aprenderemos a:

Explicar la utilidad de la gestión estructurada de excepciones. Crear y utilizar bloques Try…Catch…Finally. Lanzar excepciones.

Page 41: 8. Manejo de Errores

Manejo de errores y excepciones 39

La clase Exception

Las clases Exception permiten recuperar información sobre cualquier excepción que encontremosLas propiedades de la clase base Exception permiten analizar excepciones

Principales propiedades: StackTrace, Message, HelpLink, Source

IOExceptionIOException

ExceptionException

OutOfMemoryExceptionOutOfMemoryException

ApplicationExceptionApplicationException

SystemExceptionSystemException

FileNotFoundExceptionFileNotFoundException

El .NET Framework proporciona el siguiente modelo de objeto de excepciones:

¿Qué es una excepción? Una excepción es cualquier condición de error o comportamiento imprevisto que se produce durante la ejecución de un programa y requiere la ejecución de código fuera del flujo de control normal. Las excepciones pueden provocarse por un fallo de nuestro código o de código invocado, porque los recursos del sistema operativo no estén disponibles, por condiciones imprevistas que encuentre el CLR, etc. Una excepción se lanza (en otras palabras, se origina) desde el área del código donde se ha producido un problema.

La clase Exception En el .NET Framework, el entorno de ejecución crea un objeto que representa una excepción cuándo ésta se produce. Las excepciones son objetos que heredan de la clase base Exception. El .NET Framework define varias clases de excepciones. Estas clases proporcionan información sobre excepciones de un modo significativo y nos permiten recuperar información sobre cualquier excepción que encontremos. Esta información nos ayuda a depurar eficazmente nuestras aplicaciones.

La siguiente tabla describe algunas propiedades de la clase base Exception que nos ayudarán a identificar la localización del código, tipo y causa de una excepción. Cualquier excepción que herede de la clase base proporcionará estas propiedades.

Propiedad Descripción StackTrace Ofrece una lista de los métodos invocados que conducen a la excepción,

ayudándonos a encontrar en qué parte del código se produce el error.

Message Devuelve un mensaje de texto que describe el error. Utilizar esta propiedad para recuperar información acerca de porqué se ha lanzado una excepción.

Podemos cambiar el texto para que un mensaje críptico sea más fácil de entender. Si no proporcionamos una cadena de texto para el mensaje de error, se utilizará el valor predeterminado.

HelpLink Obtiene o establece un enlace a un archivo asociado de Ayuda.

Source Obtiene o establece una cadena que contiene el nombre del objeto que causa el error o el nombre del ensamblado en el que se originó la excepción.

Page 42: 8. Manejo de Errores

40 Manejo de errores y excepciones

¿Qué es la gestión estructurada de excepciones?

Detecta y responde a errores mientras se ejecuta una aplicación

Utiliza Try…Catch…Finally para encapsular y proteger bloques de código que podrían provocar errores

Cada bloque tiene uno o más controladores asociados

Cada controlador especifica alguna forma de condición de filtro en el tipo de excepción que controla

Ventajas:

Permite la separación entre la lógica y el código de gestión de errores

Facilita la lectura, depuración y mantenimiento del código

Introducción La gestión estructurada de excepciones es código diseñado para detectar y responder a errores durante la ejecución combinando una estructura de control (similar a Select Case o While) con excepciones, bloques de código protegidos y filtros.

Consecuencias de no gestionar las excepciones

Si se produce una excepción en un método no preparado para gestionarla, la excepción se propaga hacia el método invocador. Si no se gestiona en el método que origina la llamada, la búsqueda de un controlador continúa hasta la pila de llamadas. Si no existe un controlador para la excepción, aparecerá un mensaje de error y la aplicación se cerrará.

Uso de la gestión estructurada de excepciones

Utilizando la instrucción Try…Catch…Finally, podemos proteger bloques de código que potencialmente podrían provocar errores.

El bloque Try incluye una expresión que podría generar una excepción. El bloque Try tiene una o más instrucciones Catch asociadas, que filtran excepciones y las asocian con una determinada acción. Si se produce la excepción, el entorno de ejecución detiene la ejecución normal e inicia la búsqueda de un bloque Catch que pueda capturar la excepción, basándose en su tipo.

Si no se encuentra un bloque Catch apropiado en el procedimiento inmediato, el entorno de ejecución continúa por la pila de llamadas buscando el procedimiento que originó la llamada.

Si no se encuentra un bloque Catch apropiado allí, el entorno de ejecución busca el procedimiento que invocó el procedimiento de originó la llamada, y así sucesivamente, hasta encontrar un bloque Catch apropiado.

Si se encuentra un bloque Catch, se considera que se ha capturado la excepción, y la ejecución se reinicia, empezando con el cuerpo del bloque Catch.

Si no se encuentra ningún bloque Catch, aparecerá un mensaje de error y la aplicación se cerrará.

Page 43: 8. Manejo de Errores

Manejo de errores y excepciones 41

Con el uso de los bloques Try y Catch, separamos las instrucciones de control

de errores de las instrucciones lógicas principales. De esto modo, se facilita la lectura y depuración del programa.

Page 44: 8. Manejo de Errores

42 Manejo de errores y excepciones

Cómo utilizar la instrucción Try…Catch

Ponga código que podría lanzar excepciones en un bloque Try

Gestione las excepciones en otro bloque CatchTry

fs = New FileStream("data.txt", _ FileMode.Open)

Catch ex As FileNotFoundException

MessageBox.Show("File not found")

Catch ex As Exception

MessageBox.Show(ex.Message)

End Try

Try

fs = New FileStream("data.txt", _ FileMode.Open)

Catch ex As FileNotFoundException

MessageBox.Show("File not found")

Catch ex As Exception

MessageBox.Show(ex.Message)

End Try

Program LogicProgram Logic

Exception HandlingException Handling

Sintaxis Podemos implementar la gestión estructurada de excepciones en Visual Basic .NET utilizando la instrucción Try…Catch. El siguiente código muestra la estructura de una instrucción Try…Catch sencilla:

Try ' Starts a structured exception handler Catch [optional filter] ' This code runs if the statements listed in the Try block ' fail and the filter on the Catch statement is true End Try ' Ends a structured exception handler

Dónde ubicar el código El bloque Try de un controlador de excepciones Try...Catch contiene la

sección de código que deseamos que nuestro controlador de excepciones monitorice. Es conveniente ubicar las secciones de código que podrían lanzar excepciones en un bloque Try y el código que controla las excepciones en un bloque Catch.

Cómo se procesa la instrucción Try…Catch

El código del bloque Try siempre se ejecuta. Si se produce un error durante la ejecución de cualquier parte del código de la sección Try, Visual Basic examina cada instrucción Catch del controlador de excepciones hasta que concuerda el tipo de excepción que se ha producido con el nombre de la excepción especificado en la instrucción Catch y transfiere el control a la primera línea de código de la instrucción Catch. Si no se encuentra un bloque Catch apropiado, se produce un error.

Las instrucciones Catch se procesan en orden; por ello, es importante el orden en que escribimos nuestras instrucciones Catch. Deberíamos poner los bloques Catch destinados a excepciones específicas antes de un bloque Catch de una excepción general.

Importante

Page 45: 8. Manejo de Errores

Manejo de errores y excepciones 43

Ejemplo de uso de Try…Catch

El siguiente código proporciona un ejemplo sencillo de un controlador de excepciones estructurado. En este ejemplo, se ejecuta el bloque Try. Si se produce un error FileNotFoundException, se ejecutará el código del primer bloque Catch. Para el resto de errores, se ejecutará el código del segundo bloque Catch.

Observemos que en el primer bloque Catch buscamos errores específicos. El segundo bloque Catch está diseñado para capturar cualquier error general.

Try fs = New FileStream("data.txt", FileMode.Open) Catch ex As FileNotFoundException MessageBox.Show("File not Found") Catch ex As Exception MessageBox.Show(ex.Message) End Try

Page 46: 8. Manejo de Errores

44 Manejo de errores y excepciones

Cómo utilizar el bloque Finally

Sección opcional; si se incluye, se ejecuta siempreColoque código de limpieza, como el utilizado para cerrar archivos, en el bloque Finally

Try

fs = New FileStream("data.txt", FileMode.Open)

Catch ex As FileNotFoundException

MessageBox.Show("Data File Missing")

Catch ex As Exception

MessageBox.Show(ex.Message)

Finally

If Not (fs Is Nothing) Then fs.Close( )

End Try

Try

fs = New FileStream("data.txt", FileMode.Open)

Catch ex As FileNotFoundException

MessageBox.Show("Data File Missing")

Catch ex As Exception

MessageBox.Show(ex.Message)

Finally

If Not (fs Is Nothing) Then fs.Close( )

End Try

Introducción El bloque Finally es un bloque de código opcional, que si se incluye, siempre se ejecuta. En este bloque, podemos definir acciones que deben realizarse con independencia de si se produce una excepción. Se podrían incluir acciones como cerrar archivos o liberar objetos. El bloque Finally se utiliza habitualmente para limpiar recursos utilizados en nuestro código cuando un método falla.

El código de la sección Finally siempre se ejecuta al final, justo antes de que el bloque de gestión de errores pierda el alcance. Si incluimos este bloque, se ejecuta después del bloque Try si no se producen errores, o después de que el bloque Catch adecuado se haya procesado si se ha capturado una excepción.

Page 47: 8. Manejo de Errores

Manejo de errores y excepciones 45

Ejemplo de uso de Try…Catch…Finally

El siguiente código proporciona un ejemplo de uso de un bloque Finally para cerrar un archivo abierto.

En este ejemplo:

El bloque Try siempre se ejecuta.

• Si hay un error FileNotFoundException, el código del primer bloque Catch se ejecuta a continuación, seguido del código del bloque Finally.

• Si se produce cualquier otro tipo de error, el código del segundo bloque Catch se ejecuta a continuación, seguido del código del bloque Finally.

Si no hay ningún error, el código del bloque Finally se ejecuta después del código del bloque Try.

Try fs = New FileStream("data.txt", FileMode.Open) Catch ex As FileNotFoundException MessageBox.Show("Data File Missing") Catch ex As Exception MessageBox.Show(ex.Message) Finally If Not (fs Is Nothing) Then fs.Close( ) End Try

Page 48: 8. Manejo de Errores

46 Manejo de errores y excepciones

Cómo lanzar excepciones

Utilice la instrucción Throw para crear una excepción que usted pueda controlar con el código de la gestión estructurada de excepciones

If (day < 1) Or (day > 365) Then

Throw New ArgumentOutOfRangeException( )

Else

...

End If

If (day < 1) Or (day > 365) Then

Throw New ArgumentOutOfRangeException( )

Else

...

End If

Introducción La instrucción Throw crea una excepción que podemos controlar con el código de la gestión estructurada de excepciones. En algunos casos, deberíamos utilizar una instrucción Throw para lanzar una excepción, que puede ser atrapada invocando código. Para entender cuando podríamos necesitar lanzar una excepción, pensemos en el siguiente escenario.

Escenario utilizando la instrucción Throw

Cuando escribimos aplicaciones grandes, es una práctica habitual escribir código reutilizable: procedimientos Function y Sub que pueden utilizarse repetidamente en la aplicación o en otras aplicaciones. Normalmente, una función toma ciertos parámetros, realiza una tarea y puede devolver un valor. Por ejemplo: una función que tome el día del año como un entero y devuelva la fecha del calendario. Cuando pase el número 33, se supone que esta función devolverá “2 de febrero”.

Como desarrolladores de esta función, necesitamos pensar cómo controlar el caso de pasar a la función un dato no válido. Por ejemplo, si se pasa a la función un número negativo, o un número mayor que 365 en caso de años no bisiestos, se producirá un error, y el valor devuelto no será correcto.

La mejor solución a este problema es dependiente de la aplicación. En un caso sencillo, podríamos pedir al usuario que introdujera la información correcta. Sin embargo, si esta función es invocada por otra función en lugar de por un usuario, la solución no es tan sencilla. En este caso, podemos escribir una instrucción Throw que lance la excepción adecuada en caso de que el argumento pasado a la función esté fuera de rango.

Ejemplo de uso de la instrucción Throw

El siguiente código utiliza la instrucción Throw para crear un error ArgumentOutOfRangeException:

If (day < 1) Or (day > 365) Then Throw New ArgumentOutOfRangeException( ) Else ... End If

Page 49: 8. Manejo de Errores

Manejo de errores y excepciones 47

Directrices para el uso de la gestión estructurada de excepciones

excepciones

No utilice la gestión estructurada de excepciones para errores que probablemente se producirán de modo rutinario. Utilice otros bloques de código para abordar estos errores.

If…End If, etc.

No utilice la gestión estructurada de excepciones para errores que probablemente se producirán de modo rutinario. Utilice otros bloques de código para abordar estos errores.

If…End If, etc.

Devuelva un valor para los casos de errores habituales.Ejemplo: los métodos de lectura de E/S de archivos no lanzan excepción de fin de archivo.

Devuelva un valor para los casos de errores habituales.Ejemplo: los métodos de lectura de E/S de archivos no lanzan excepción de fin de archivo.

Organice los bloques Catch de específicos a generales.Organice los bloques Catch de específicos a generales.

Introducción La gestión estructurada de excepciones puede ser un modo eficaz de controlar posibles errores de nuestra aplicación. Sin embargo, es importante saber cuándo utilizar un bloque Try…Catch…Finally y cuándo utilizar otras soluciones de código para solucionar un problema. Si es probable que un problema ocurra, podemos buscarlo programáticamente y abordarlo sin utilizar la gestión estructurada de excepciones. Cuando un error es realmente una excepción (cuando es posible pero poco probable que ocurra) resulta adecuado el uso de la gestión estructurada de excepciones.

Ejemplo de control de un error potencial utilizando una instrucción If

El siguiente ejemplo utiliza una instrucción If para comprobar si una conexión está cerrada. Podemos utilizar este método como alternativa para lanzar una excepción si la conexión no está cerrada.

If conn.State <> ConnectionState.Closed Then conn.Close( ) End If

Ejemplo de control del mismo error utilizando Try…Catch

En el siguiente ejemplo se lanza una excepción si la conexión no está cerrada.

Try conn.Close( ) Catch ex As InvalidOperationException ' Do something with the error or ignore it End Try

Cuándo utilizar cada método

El método que decidamos utilizar para controlar errores potenciales depende de con qué frecuencia esperamos que se produzca un determinado evento. Si el evento es realmente excepcional y es un error (como un error imprevisto de fin de archivo), utilizar la gestión de excepciones es mejor porque se ejecuta menos

Page 50: 8. Manejo de Errores

48 Manejo de errores y excepciones

código en el caso normal. Si el evento ocurre de modo rutinario, es mejor utilizar otro método para buscar errores. En ese caso, si ocurre una excepción, ésta tardará más en controlarse.

Otras directrices para la gestión estructurada de excepciones

La siguiente lista describe otras directrices a seguir cuando implementamos la gestión estructurada de excepciones:

Si sabemos que se va a producir una situación determinada, como un error de fin de archivo, no utilizar una excepción para señalizarlo. Utilicemos el valor devuelto del método. Por ejemplo, en el .NET Framework, los métodos de lectura de archivos de entrada/salida (E/S) no lanzan una excepción de fin de archivo. En lugar de ello, devuelven un valor que indica que no pueden leer desde el archivo.

Ordenar siempre las excepciones en bloques Catch desde la más a la menos específica. Esta técnica controla la excepción específica antes de pasar a un bloque Catch más general.

Utilizar los bloques Try…Finally alrededor del código que puede generar potencialmente una excepción, y colocar sus instrucciones Catch en una ubicación. Cuando lo haga, la instrucción Try generará la excepción, la instrucción Finally cerrará o reasignará recursos, y la instrucción Catch controlará la excepción desde una ubicación central.

Si se desea más información sobre cuándo utilizar la gestión estructurada de excepciones, consulte Best Practices for Handling Exceptions en la documentación de Visual Studio .NET.

Nota

Page 51: 8. Manejo de Errores

Manejo de errores y excepciones 49

Demostración: Uso de la gestión estructurada de excepciones

excepciones

En esta demostración, aprenderemos cómo implementar la gestión estructurada de excepciones en nuestro código

En esta demostración, estudiaremos cómo utilizar la instrucción Try…Catch para implementar la gestión estructurada de excepciones.

Ejecutar la aplicación

1. Abrir la solución Exceptions.sln, que se encuentra en la carpeta Exceptions. Esta carpeta se puede encontrar dentro del fichero demos08.zip.

2. Abrir el Editor de código del formulario Exceptions.vb y establecer seis puntos de interrupción: uno en la instrucción Try, y uno en cada instrucción Catch en la rutina RunExceptions.

3. Ejecutar el proyecto Exceptions. 4. Hacer clic en el botón Overflow del formulario. El proceso de Visual Basic

se detendrá en el primer punto de interrupción. 5. Utilizar F8 para recorrer el código paso a paso en el bloque Try, y explique

los detalles del overflow. Explique que la clase OverflowException filtra la excepción.

6. Recorrer el resto de código de la excepción del overflow. Cuando se muestre el cuadro de mensaje, hacer clic en OK y pulsar F5 para proseguir con la ejecución.

7. Mostrar todos los botones restantes del formulario de prueba (Divide by zero, Index out of Range y Cast Error) del mismo modo: a. Hacer clic en el botón adecuado del formulario. b. Utilizar F8 para recorrer por el código y mostrar cómo se controlan las

excepciones en cada caso. c. Hacer clic en OK y pulsar F5 para proseguir con la ejecución.

8. Cuando hayamos mostrado el control de excepciones para cada botón finalizar la sesión de depuración cerrando el formulario.

9. Cerrar el entorno de desarrollo Visual Studio .NET.