Vyjímky v části finally

Written by Tom Hublek on July 15th, 2004

Pozor na vyhazování vyjímek v Javě v části finally. Pokud vyhodíte vyjímku v části finally, může to překrýt skutečnou příčinu problému.

Příklad

class ExceptionTest {  static class Ex0 extends Exception {}  static class Ex1 extends Exception {}  static class Ex2 extends Exception {}  public static void main(String args[]) throws Exception {       try {      throw new Ex0();    } catch (Exception e) {      throw new Ex1();    } finally {      throw new Ex2();    }  }}

vyhodí vyjímku Ex2.

K napsání tohoto spotu mě inspiroval kolega, který se ptal co udělat v následujícím případě:

void doSomethingWithFile(String filename) {  FileReader in = null;  try {     in = new FileReader(new File(filename));     while ((c = in.read()) != -1)        	             out.write(c);	  } catch (IOException e) {     throw new RuntimeException(e);  } finally {      if (in != null) {        try { in.close(); }         catch (IOException) {           // ?? what to do with this exception			                }     }  }}

Uvědomil jsem si že exception v bloku finally obvykle jen loguju a jinak s ní nic nedělám. Jeho návrh byl tam dát také vyhození vyjímky.

Poradil jsem mu ať tuto exception také jenom zaloguje a novou exception nevyhazuje, protože ta by překryla tu původní, kde může být skutečná příčina.

Jak to řešíte vy?

  • Share/Bookmark
 

Leave a Comment