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?