##
CAPTURAR EXCEPCIONES

Las excepciones lanzadas por un método que pueda hacerlo deben recoger en bloque try/catch o try/finally.

    int valor;
    try {
        for( x=0,valor = 100; x < 100; x ++ )
            valor /= x;
        }
    catch( ArithmeticException e ) {
        System.out.println( "Matemáticas locas!" );
        }
    catch( Exception e ) {
        System.out.println( "Se ha producido un error" );
        }

### try

Es el bloque de código donde se prevé que se genere una excepción. Es como si dijésemos "intenta estas sentencias y mira a ver si se produce una excepción". El bloque try tiene que ir seguido, al menos, por una cláusula catch o una cláusula finally

### catch

Es el código que se ejecuta cuando se produce la excepción. Es como si dijésemos "controlo cualquier excepción que coincida con mi argumento". En este bloque tendremos que asegurarnos de colocar código que no genere excepciones. Se pueden colocar sentencias catch sucesivas, cada una controlando una excepción diferente. No debería intentarse capturar todas las excepciones con una sola cláusula, como esta:

        catch( Excepcion e ) { ...

Esto representaría un uso demasiado general, podrían llegar muchas más excepciones de las esperadas. En este caso es mejor dejar que la excepción se propague hacia arriba y dar un mensaje de error al usuario.

Se pueden controlar grupos de excepciones, es decir, que se pueden controlar, a través del argumento, excepciones semejantes. Por ejemplo:

    class Limites extends Exception {}
    class demasiadoCalor extends Limites {}
    class demasiadoFrio extends Limites {}
    class demasiadoRapido extends Limites {}
    class demasiadoCansado extends Limites {}
        .
        .
        .
        try {
            if( temp > 40 )
                throw( new demasiadoCalor() );
            if( dormir < 8 )
                throw( new demasiado Cansado() );
        } catch( Limites lim ) {
            if( lim instanceof demasiadoCalor )
                {
                System.out.println( "Capturada excesivo calor!" );
                return;
                }
            if( lim instanceof demasiadoCansado )
                {
                System.out.println( "Capturada excesivo cansancio!" );
                return;
                }
        } finally
            System.out.println( "En la clausula finally" );

La cláusula catch comprueba los argumentos en el mismo orden en que aparezcan en el programa. Si hay alguno que coincida, se ejecuta el bloque. El operador instanceof se utiliza para identificar exactamente cual ha sido la identidad de la excepción.

### finally

Es el bloque de código que se ejecuta siempre, haya o no excepción. Hay una cierta controversia entre su utilidad, pero, por ejemplo, podría servir para hacer un log o un seguimiento de lo que está pasando, porque como se ejecuta siempre puede dejarnos grabado si se producen excepciones y nos hemos recuperado de ellas o no.

Este bloque finally puede ser útil cuando no hay ninguna excepción. Es un trozo de código que se ejecuta independientemente de lo que se haga en el bloque try.

Cuando vamos a tratar una excepción, se nos plantea el problema de qué acciones vamos a tomar. En la mayoría de los casos, bastará con presentar una indicación de error al usuario y un mensaje avisándolo de que se ha producido un error y que decida si quiere o no continuar con la ejecución del programa.

Por ejemplo, podríamos disponer de un diálogo como el que se presenta en el código siguiente:

    public class DialogoError extends Dialog {
        DialogoError( Frame padre ) {
            super( padre,true );
            setLayout( new BorderLayout() );

            // Presentamos un panel con continuar o salir
            Panel p = new Panel();
            p.add( new Button( "¿Continuar?" ) );
            p.add( new Button( "Salir" ) );

            add( "Center",new Label(
                "Se ha producido un error. ¿Continuar?" ) )
            add( "South",p );
            }

        public boolean action( Event evt,Object obj ) {
            if( "Salir".equals( obj ) )
                {
                dispose();
                System.exit( 1 );
                }
            return false;
            }
        }

Y la invocación, desde algún lugar en que se suponga que se generarán errores, podría ser como sigue:

    try {
        // Código peligroso
        }
    catch( AlgunaExcepcion e ) {
        VentanaError = new DialogoError( this );
        VentanaError.show();
        }

|  | ##### [Anterior] [Indice] [Siguiente]