Diferencia entre revisiones de «Sentencia condicional»

Contenido eliminado Contenido añadido
m Revertidos los cambios de 200.30.174.190 (disc.) a la última edición de Jkbw
Línea 5:
 
Las sentencias condicionales constituyen, junto con los [[Bucle (programación)|bucles]], los pilares de la [[programación estructurada]], y su uso es una evolución de una sentencia en [[lenguaje ensamblador]] que ejecutaba la siguiente línea o no en función del valor de una condición.
 
== Lanzamiento de errores ==
 
En el caso de algoritmos donde se ejecutan muchas instrucciones que pueden devolver errores se vuelve
a tener el caso de condicionales anidados que dificultan la lectura. Por ejemplo:
 
Archivo f
<font color=red>SI (LeerArchivo(f)) ENTONCES
<font color=green>SI (AvanzarArchivo(f)) ENTONCES
<font color=blue>SI (ObtenerEntero(Leer(f)) ENTONCES
Cuerpo
SINO
Imprimir "El valor no es entero"
FIN SI</font>
SINO
Imprimir "Se llegó al fin del archivo"
FIN SI</font>
SINO
Imprimir "No se pudo abrir el archivo"
FIN SI</font>
CerrarArchivo(f)
 
Si bien es un problema que este anidamiento puede llegar a ser muy grande, la principal razón para utilizar el lanzamiento de errores es que con el tipo de estructura anterior se pierde la noción del camino principal, y cuesta mucho más encontrar las sentencias de ejecución normal, (en este caso Cuerpo), por la presencia de las condiciones de error que entorpecen la legibilidad.
 
Algunos lenguajes como Java han tenido esto en cuenta y desarrollaron el lanzamiento de errores, que consiste en separar el tratamiento de errores al final de la instrucción, para no perder de vista el hilo de continuidad. Para esto, los métodos en lugar de devolver un valor lógico (verdadero o falso) para determinar si la operación se efectuó correctamente, deben "lanzar" excepciones.
 
El código es ejecutado normalmente hasta que ocurre una excepción, en este caso "salta" al manejo de errores adecuado; es decir las sentencias pueden o no ejecutarse, en función de si previamente se haya lanzado un error o no. En algunos casos puede darse que exista código que debe ejecutarse al final, independientemente de si se haya lanzado o no un error (en nuestro caso podría ser la operación de cerrar el archivo para que otros puedan acceder a él), para lo cual también hay sentencias especiales.
 
<font color=red>INTENTAR
LeerArchivo(f)
AvanzarArchivo(f)
ObtenerEntero(Leer(f))
Cuerpo</font>
<font color=green>CAPTURAR Error1(ExcepciónDeAperturaDeArchivo)
Imprimir "No se pudo abrir el archivo"</font>
<font color=blue>CAPTURAR Error2(ExcepciónDeLecturaDeArchivo)
Imprimir "Se llegó al final del archivo"</font>
<font color=#404000>CAPTURAR Error3(ExcepciónDeConversiónDeDatos)
Imprimir "El valor no es entero)</font>
<font color=#800080>FINALMENTE
CuCerrarArchivo(f)</font>
 
A su vez los procedimientos que lanzan excepciones deben contener alguna línea con el siguiente código:
 
LANZAR TipoExcepción
 
El código que llama a una subrutina que puede lanzar un error, tiene dos alternativas: o la trata él mismo (con la estructura anterior) o la "LANZA" a la subrutina superior que la invocó. Algunas veces no es obligatorio tratar estos errores.
 
En Java la estructura es la siguiente:
 
<font color=red>try {
instrucciones
}</font>
<font color=green>catch (ClaseDeLaExcepción1 objetoExcepción1)
{
instruccionesPorError1
}</font>
<font color=blue>catch (ClaseDeExcepción2 ojbetoExcepción2)
{
instruccionesPorError2
}</font>
<font color=#800080>finally {
instruccionesFinales
}</font>
 
== Enlaces externos ==