Desde muchos puntos de vista aprender a programar es toda una disciplina, que requiere de tiempo y dedicación, es como si estuviéramos a prendiendo un nuevo lenguajes, como por ejemplo el inglés, sabemos que hay que respetar parámetros, en pronunciación y escritura para que se pueda entender y tener una comunicación adecuada. La principal razón por el cual las personas aprenden lenguajes y técnicas de programación es usar la computadora como una herramienta para resolver problemas. Es por ello que lo que realicemos de ahora en adelante será entablar una comunicación con nuestro ordenador de tal manera que nosotros indicaremos a través de instrucciones lo que necesitamos realizar.
Es importante mencionar que toda computadora tiene su propio lenguaje, llamado lenguaje máquina y la comunicación con la misma la debemos a lenguajes de alto nivel, estos nos facilitan la comunicación e interacción con el ordenador al contar con un compilador o interprete, que les hará saber cuales son las instrucciones que deseamos realizar.
Con respecto al ejemplo anterior donde hablamos de aprender un idioma como el inglés, es importante aclarar, que en caso de que no se escriba bien, se pronuncie bien, la comunicación con las personas del mimo habla se dificultara y hasta imposible se hará. Lo mismo pasa en los lenguajes de programación, cuando no escribimos bien una sentencia, no declaramos de manera correcta las operaciones bien sean matemáticas o ingresamos un entro de entrada cuando se esperaba un carácter, esto nos genera errores, que nos pueden paralizar el sistema y no continuar con su funcionamiento.
En la programación indistintamente del paradigma al cual pertenezca, no vamos a encontrar con tres (3) tipos de errores que son el error de sintaxis, semántico y de ejecución.
Estos errores son seguramente los más simples de resolver, pues son detectados por el intérprete (o por el compilador, según el tipo de lenguaje que estemos utilizando) al procesar el código fuente y generalmente son consecuencia de equivocaciones al escribir el programa. En el caso de Python estos errores son indicados con un mensajeSyntaxError. Por ejemplo, si trabajando con Python intentamos definir una función y en lugar dedef escribimos dev.
Se dan cuando un programa, a pesar de no generar mensajes de error, no produce el resultado esperado. Esto puede deberse, por ejemplo, a un algoritmo incorrecto o a la omisión de una sentencia.
Estos errores aparecen durante la ejecución del programa y su origen puede ser diverso. En ocasiones pueden producirse por un uso incorrecto del programa por parte del usuario, por ejemplo si el usuario ingresa una cadena cuando se espera un número. En otras ocasiones pueden deberse a errores de programación, por ejemplo si una función intenta acceder a la quinta posición de una lista de 3 elementos o realizar una división por cero. Una causa común de errores de ejecución que generalmente excede al programador y al usuario, son los recursos externos al programa, por ejemplo si el programa intenta leer un archivo y el mismo se encuentra dañado.
Imaginemos el siguiente escenario; que estamos en un cajero automático a solicitar dinero realizando la transacción de manera habitual, sin embargo el cajero no cuenta con la cantidad de dinero que usted está solicitando, es conveniente que el sistema nos informe que no cuenta con la cantidad solicitada o que intentemos con un monto menor. Pero qué pasaría si sencillamente no se nos informa de la eventualidad y la transacción falla, sencillamente el cliente o usuario queda con la duda ¿fue debitado el monto y no me lo entrego? Hasta llega a calificar al sistema de mal funcionamiento, debido a que no cumplió con su necesidad.
Es por ello que surgen las excepciones en la programación, con la finalidad de hacer los sistemas más robustos, además para dar respuestas a situaciones en que ocurran errores en ejecución, como por ejemplo una división por cero (0), acceder a bases de datos donde la información solicitada no exista; son también utilizada para que el usuario tenga una mayor satisfacciones a situaciones inherentes al mismo y no se juzgue la calidad del mismo, cabe destacar que en la actualidad la mayoría de las aplicaciones desarrolladas en diferentes lenguaje cuentan con esta herramienta, a continuación se describen la utilización en algunos lenguajes populares.
Excepciones
Los errores de ejecución son llamados comúnmente excepciones y por eso de ahora en más utilizaremos ese nombre. Durante la ejecución de un programa, si dentro de una función surge una excepción y la función no la maneja, la excepción se propaga hacia la función que la invocó, si esta otra tampoco la maneja, la excepción continua propagándose hasta llegar a la función inicial del programa y si esta tampoco la maneja se interrumpe la ejecución del programa. Veamos entonces como manejar excepciones.
Manejo de excepciones
Para el manejo de excepciones los lenguajes proveen ciertas palabras reservadas, que nos permiten manejar las excepciones que puedan surgir y tomar acciones de recuperación para evitar la interrupción del programa o, al menos, para realizar algunas acciones adicionales antes de interrumpir el programa.
Tipos de excepciones en java
El lenguaje Java diferencia claramente entre dos tipos de excepciones: errores, comprobadas (en adelante checked) y no comprobadas (en adelante unchecked). El gráfico que se muestra a continuación muestra el árbol de herencia de las excepciones en Java (se omite el paquete de todas las que aparecen, que es java.lang).
Una excepción de tipo checked representa un error del cual técnicamente podemos recuperarnos. Por ejemplo, una operación de lectura/escritura en disco puede fallar porque el fichero no exista, porque este se encuentre bloqueado por otra aplicación, etc. Todos estas situaciones, además de ser inherentes al propósito del código que las lanza (lectura/escritura en disco) son totalmente ajenas al propio código, y deben ser (y de hecho son) declaradas y manejadas mediante excepciones de tipo checked y sus mecanismos de control.
En ciertos momentos, a pesar de la promesa de recuperabilidad, nuestro código no estará preparado para gestionar la situación de error, o simplemente no será su responsabilidad. En estos casos lo más razonable es relanzar la excepción y confiar en que un método superior en la cadena de llamadas sepa gestionarla.
Por tanto, todas las excepciones de tipo checked deben ser capturadas o relanzadas. En el primer caso, utilizamos el más que conocido bloque try-catch:
import java.io.FileWriter;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
FileWriter fichero;
try {
// Las siguientes dos líneas pueden lanzar una excepción de tipo IOException
fichero = new FileWriter("ruta");
fichero.write("Esto se escribirá en el fichero");
} catch (IOException ioex)
{
// Aquí capturamos cualquier excepción IOException que se lance (incluidas sus subclases)
ioex.printStackTrace(); } } }
Una excepción de tipo unchecked representa un error de programación. Uno de los ejemplos más típicos es el de intentar leer en un array de N elementos un elemento que se encuentra en una posición mayor que N:
int[] numerosPrimos = {1, 3, 5, 7, 9, 11, 13, 17, 19, 23}; // Array de diez elementos
int undecimoPrimo = numerosPrimos[10]; // Accedemos al undécimo elemento mediante el literal numérico 10
El código anterior accede a una posición inexistente dentro del array, y su ejecución lanzará la excepción unchecked ArrayIndexOutOfBoundsException (excepción de índice de array fuera de límite). Esto es claramente un error de programación, ya que el código debería haber comprobado el tamaño del array antes de intentar acceder a una posición concreta:
int[] numerosPrimos = {1, 3, 5, 7, 9, 11, 13, 17, 19, 23};
int indiceUndecimoPrimo = 10;
if(indiceUndecimoPrimo > numerosPrimos.length) {
System.out.println("El índice proporcionado (" + indiceUndecimoPrimo + ") es mayor que el tamaño del array (" + numerosPrimos.length + ")");
} else {
int undecimoPrimo = numerosPrimos[indiceUndecimoPrimo]; }
El código anterior no sólo valida el tamaño de la colección antes de acceder a una posición concreta (el propósito fundamental del ejemplo), sino que evita el uso de literales numéricos asignando el índice del array a una variable bien nombrada.
El aspecto más destacado de las excepciones de tipo unchecked es que no deben ser forzosamente declaradas ni capturadas (en otras palabras, no son comprobadas). Por ello no son necesarios bloques try-catch ni declarar formalmente en la firma del método el lanzamiento de excepciones de este tipo. Esto, por supuesto, también afecta a métodos y/o clases más hacia arriba en la cadena invocante.
___________________________________________________________________________________
En este segmento colocamos a su disposición las Diapositivas