jueves, 4 de junio de 2009

Gestion de Excepciones

Gestión de Excepciones

La gestión de excepciones de Java lleva la gestión del error en tiempo de ejecución al mundo orientado a objetos. Una excepción de Java es un objeto que describe una condición excepcional que se ha producido en un fragmento de código.

Excepciones no capturadas

Los objetos de excepción los crea automáticamente el intérprete de Java como respuesta a alguna condición excepcional. Como ejemplo tomamos una división por cero. Cuando el intérprete de Java intenta ejecutar la división, observa que el denominador es cero y construye un nuevo objeto de excepción para que se detenga este código y se trate esta condición de error. Una vez detenido el flujo del código en el operador de división, se buscará en la pila de llamadas actual cualquier gestor de excepciones (pila que contiene un registro de las llamadas a método).
Un gestor de excepciones es algo establecido para tratar inmediatamente la condición excepcional. Si no codificamos un gestor de excepciones, se ejecutara el gestor en tiempo de ejecución por defecto. El gestor por defecto imprime el valor String de la excepción y el trazado de la pila del lugar donde se produjo la excepción.

try y catch

A menudo es más elegante y practico manejar nosotros mismos la excepción. Se puede utilizar la palabra clave try para especificar un bloque de código que se debería proteger frente a todas las excepciones. A continuación inmediatamente del bloque try, se incluye la cláusula catch que especifica el tipo de excepción que se desea captar. Veamos estas construcciones sobre el ejemplo anterior de la división:

class Exc {
        public static void main(String args[])  {
               try  {
                       int d = 0;
                       int a = 42;
                } catch (ArithmeticException e)  {
                       System.out.println("división por cero");
                }
        }
}

ArithmeticException es una subclase especial de Exception, que describe más específicamente el tipo de error que se ha producido. El ámbito de la cláusula catch está restringido a las sentencias especificadas por la sentencia try precedente.

Cláusulas catch múltiples

En algunos casos, la misma secuencia de código puede activar más de una condición excepcional. Se pueden tener varias cláusulas catch en una fila. Se inspecciona cada uno de estos tipos de excepción en el orden en que están y el primero que coincida se ejecuta. Las clases de excepción más especificas se colocaran primero, dado que no se alcanzarán las subclases si están después de unas superclase.

throw

La sentencia throw se utiliza para lanzar explícitamente una excepción. En primer lugar, debe obtener un descriptor de una instancia de Throwable, mediante un parámetro en una cláusula catch, o cerrar una utilizando el operador new. esta es la forma general de una sentencia throw:

throw InstanciaThrowable;

El flujo de la ejecución se detiene inmediatamente después de la sentencia throw, y no se llega a la sentencia siguiente. Se inspecciona el bloque try que la engloba más cercano para ver si tiene una cláusula catch cuyo tipo coincida con el de la instancia Throwable. Si la encuentra, el control se transfiere a esa sentencia. Si no, se inspecciona el siguiente bloque try que la engloba, y así sucesivamente, hasta que le gestor de excepción más externo detiene el programa e imprime el trazado de la pila hasta la sentencia throw.

finally

A veces es necesario estar seguro de que se ejecutará un fragmento de código dado independientemente de que excepciones se provocan y capturan. Se puede utilizar la palabra clave finally par identificar dicho bloque de código. Incluso aunque so coincida ninguna de las cláusulas catch, se ejecutará el bloque finally antes del código que está después del final del bloque try completo.

No hay comentarios:

Publicar un comentario