Zpracování chyb

Výjimky představují určité situace, ve kterých musí být výpočet přerušen a řízení předáno na místo, kde bude provedeno ošetření výjimky a rozhodnutí o dalším pokračování výpočtu. Starší programovací jazyky pro ošetření chyb během výpočtu obvykle žádnou podporu neměly. U všech funkcí, které mohly objevit chybu, bylo třeba stále testovat různé příznaky a speciální návratové hodnoty, kterými se chyba oznamovala, a v případě, že jsme na testování chyby zapomněli, program běžel dál a na chybu v nejlepším případě nereagoval nebo se zhroutil na zcela jiném místě, kde již bylo obtížné zdroj chyby dohledat. 

Jazyk Java, podobně jako např. C++, využívá pro ošetření výjimek metodu strukturované obsluhy. To znamená, že programátor může pro konkrétní úsek programu specifikovat, jakým způsobem se má konkrétní typ výjimky ošetřit. V případě, že výjimka nastane, vyhledá se vždy nejbližší nadřazený blok, ve kterém je výjimka ošetřena.

Výjimky jsou v jazyce Java reprezentovány jako objekty...tyto objekty jsou instancemi tříd odvozených obecně od třídy Throwable se dvěma podtřídami Error a Exception. Každá z těchto podtříd odpovídá jedné skupině výjimek. V první skupině jsou výjimky, jejichž výskyt představuje vážný problém v činnosti aplikace a které by programátor neměl zachycovat. Druhou skupinu tvoří výjimky, jejichž ošetření má smysl - jde například o výjimky jako pokus o otevření neexistujícího souboru, chybný formát čísla apod. Do této skupiny by měly patřit také veškeré výjimky definované uživatelem.

 

Příkaz try-catch

Zpracování výjimky se vždy vztahuje k bloku programu omezenému příkazem try následovaném jedním nebo více bloky catch popisujícími způsob ošetření jednotlivých výjimek. 

Příklad chceme-li ošetřit chyby při práci se souborem (v jazyce Java):

InputStream fs = null; 
try { 
   fs = new FileInputStream("data.txt"); 
} catch( FileNotFoundException e ) { 
   System.err.println("Soubor data.txt nenalezen"); 
   System.exit(2); 
}   

Příklad ošetření chyby při chybném parsování čísla (parsujeme například textový řetězec):

class TiskCisel { 
   public static void main(String[] args) { 
      try { 
         int n = Integer.parseInt(args[0]); 
         for(int i = 1; i <= n; i++) 
            System.out.println(i); 
      } catch( NumberFormatException e ) { 
         System.err.println("Chyba: Nespravny format argumentu"); 
      } 
   } 
}

 

Potřebujeme-li vyvolat v programu vlastní výjimku, je třeba nejprve vytvořit vhodnou třídu, odvozenou od třídy Exception nebo některé její podtřídy.

class MojeVyjimka extends Exception { 
   MojeVyjimka(String msg) { super(msg); } 
}


class Vyjimky { static void zpracuj(int x) throws MojeVyjimka { System.out.println("Volani zpracuj " + x); if( x < 0 ) throw new MojeVyjimka("Parametr nesmi byt zaporny"); } public static void main(String args[]) { try { zpracuj(1); zpracuj(-1); } catch( MojeVyjimka e ) { e.printStackTrace(); } } }

 

 Čerpáno ze skript Programovací jazyky Java  (Miroslav Beneš)

Kam dál?