Table of Contents

Výjimky

MojeVyjimka.java

Z dokumentace ke třídě Exception zjistíme, že ta poskytuje 4 konstruktory. Každý může být užitečný, takže si je zařídíme také všechny.

package vyjimky;
 
public class MojeVyjimka extends Exception {
 
    /**
     * Konstruktor bez zpravy. Muze se zdat k nicemu, nicmene
     * pokud mate chytre navrzenou hierarchii vyjimek, lze
     * to obcas zvladnout i beze slov ... :-)
     * A navic, vyjimky vetsinou potrebujete
     * selektivne zpracovavat, takze se hierarchie hodi.
     * Parsovani zprav neni moc dobry napad ...
     */
    public MojeVyjimka (){
        super();
    }
 
    /**
     * Konstruktor se zpravou
     * @param message zprava
     */
    public MojeVyjimka (String message){
        super(message);
    }
 
    /**
     * Konstruktor, kteremu muzete dat zpravu i "pricinu".
     * Pokud zpracovavate vyjimku na vice urovnich, muzete tu
     * starou "pribalit",
     * paklize chcete nutne vyhodit novou vyjimku.
     * @param message zprava
     * @param cause puvodni vyjimka
     */
    public MojeVyjimka (String message, Throwable cause){
        super(message, cause);
    }
 
    /**
     * Konstruktor jen s pricinou. Viz vyse.
     * @see #MojeVyjimka(java.lang.String, java.lang.Throwable)
     * @param cause puvodni vyjimka
     */
    public MojeVyjimka (Throwable cause){
        super(cause);
    }
}

Main.java

package vyjimky;
 
public class Main {
    public static void c(){
        System.out.println("c");
        /*
         * hmm, deleni nulou, jak to asi dopadne ...
         * k vypisu "c-konec" se nedostaneme
         */
        int a = 1/0;
        System.out.println("c-konec");
    }
 
    /**
     * metoda b
     * @throws MojeVyjimka je potomkem Exception,
     * takze ji v metode musime deklarovat
     */
    public static void b() throws MojeVyjimka{
        System.out.println("b");
        try{
            c();
        }
        catch (ArithmeticException ex){
            /*
             * vyjimku chytime, vypiseme, a posleme dal
             */
            System.out.println("hlupaku: "+ ex.getMessage());
            throw ex;
        }
        finally {
            /*
             * Kod v sekci finally se provede v kazdem pripade:
             *  1. sekce try skonci normalne
             *  2. ze sekce try se utece pomoci return
             *  3. ze sekce se vyskoci vyjimkou
             *  4. ze sekce se vyskoci vyjimkou a v catch ji odchytime
             */
            System.out.println("b-konec");
        }
    }
 
    public static void a() throws MojeVyjimka{
        System.out.println("a");
        try {
            b();
        }
        catch (ArithmeticException ex){
            //throw new MojeVyjimka();
            //throw new MojeVyjimka(ex);
            throw new MojeVyjimka("Zachycena vyjimka", ex);
        }
        /*
         * tento kod se neprovede v pripade, ze se v sekci
         * catch zase vyhazuje vyjimka
         */
 
        System.out.println("a-konec");
    }
 
    public static void main (String [] args) throws MojeVyjimka{
        try{
            a();
        }
        /*
         * Vyjimky se musi zachytavat od tech v hierarchii
         * nejnize. Obracene by nam to ted ani nedovolil
         * prekladac.
         */
        catch (MojeVyjimka ex){
            System.out.println("nastala moje chyba: "+ex.getMessage());
            /*
             * Poslali jsme pribalenou jinou vyjimku, takze
             * stacktrace bude celkem pekny.
             * Pokud bychom ji nepribalili, tak ztratime informaci o tom
             * kde skutecne vyjimka vznikla.
             * Misto toho budeme vedet pouze, kde jsme vyhodili tu druhou.
             * Abychom se opravdu dozvedeli puvodni pricinu vyjimky,
             * je dobre:
             *   1. ji bud jen preposilat (throw ex)
             *   2. pribalovat do konstruktoru te nove, pokud nutne potrebujeme
             *      nekde zachytavat a posilat jinou.
             */
            ex.printStackTrace();
        }
        catch (ArithmeticException ex){
            System.out.println("nastala aritmeticka chyba: "+ex.getMessage());
        }
        catch (Exception ex){
            System.out.println("nastala obecna chyba: "+ex.getMessage());
        }
        System.out.println("konec");
    }
}
pjvomo/vyjimky.txt · Last modified: 2011/08/16 20:33 by 127.0.0.1
Back to top
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0