Warum catch ( Exception e ) schlecht ist, und was man dagegen tun kann
private void setLaf()
{
try
{
UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );
}
catch ( ClassNotFoundException e )
{
handle();
}
catch ( InstantiationException e )
{
handle();
}
catch ( IllegalAccessException e )
{
handle();
}
catch ( UnsupportedLookAndFeelException e )
{
handle();
}
}
Oftmals befindet sich dann im Quellecode eine Anweisung wie catch ( Exception e ), die große Kaskaden von catch-Anweisungen verkleinern soll. (So kann man auch den gleichen Handler verwenden.) Das Problem dabei: Man fängt mehr, als man will, insbesondere wertvolle RuntimeExceptions, die man ungern als checked SQL- oder sonstwas-Exeption vernudelt haben möchte. Wenn ich mir moderne Frameworks, wie Spring oder Java EE 5 anschaue, wird dort ausschließlich mit RuntimeException gearbeitet, und die fängt eine catch ( Exception e ) ebenfalls brutal ab. Wenn zum Beispiel das Framework aufgrund einer unchecked Exception eine Transaktion abbricht, wir diesen Fehler aber schon „weggefangen“ haben, ist das ein echtes Problem.
Ich sehe für eine vernünftige Behandlung mehrere Möglichkeiten:
- Warten auf Java 3000, da dort sicherlich so etwas wie catch ( IOException, SQLException e ) definiert wird.
- Eine gemeinsame handle()-Funktion zu definieren, die man dann aus den catch-Handlern ansteuert.
- Ein catch ( Exception e ) und dann ein instanceof Test auf die erwarteten Exceptions mit einer re-thow, wenn der Typ nicht bekannt ist.

2 Comments:
Hallo Christian,
ich finde die 3. Lösung mit dem rethrow am besten.
So kann man weiterhin zunächst mit Kanonen auf Spatzen schießen und verliert trotz nicht die Hilfe des Frameworks usw.
Danke für den Tip.
By
Stevie, at Dezember 14, 2007 4:55 AM
try {
whatever();
} catch (RuntimeException re) {
throw re;
} catch (Exception e) {
handler(e);
}
By
Anonym, at Januar 05, 2008 9:38 AM
Kommentar veröffentlichen
<< Home