Welche Variante besser ist, hängt davon ab, wie wahrscheinlich es ist, dass Ihr Code die spezifischen Ausnahmen abfangen wird. Wenn Sie wahrscheinlich nur die allgemeineren (Superklassen-)Ausnahmen abfangen (oder anderweitig unterscheiden), dann erreichen Sie mit vielen spezifischeren (Unterklassen-)Ausnahmen nicht viel. In diesem Fall ist es wahrscheinlich besser, weniger Ausnahmen zu definieren und Ausnahmemeldungen zu verwenden, um die genauen Details dessen auszudrücken, was schief gelaufen ist.
Andererseits, wenn spezifische Ausnahmen bereits existieren, macht es Sinn, sie zu verwenden. Einfach java.lang.Exception
oder java.lang.RuntimeException
zu werfen, ist meiner Meinung nach einfach faul.
NACHFRAGE
Nun, ich fange immer spezifische Ausnahmen ab, aber das Problem ist, dass ich in anderen "catches" ebenfalls spezifische Ausnahmen verwende, die irgendwie ähnlich sind (sie können sich zum Beispiel auf "Datenbank" beziehen, sind aber nicht identisch). Also die Frage ist, ob es sinnvoll wäre, eine "DatabaseException" zu erstellen und zu verwenden, anstatt zum Beispiel "DatabaseConnectionException" und "DatabaseDataException" zu verwenden, was lesbarer ist, aber am Ende hätte ich Millionen von expliziten Ausnahmen.
Wenn Ihr Code häufig so aussieht:
try {
...
} catch (DatabaseConnectionException ex) {
// etwas tun
} catch (DatabaseDataException ex) {
// dasselbe tun
} catch (DatabaseTangoException ex) {
// dasselbe tun
}
... dann helfen Ihnen Ihre fein granulierten Ausnahmen nicht. Aber wenn es so aussieht:
try {
...
} catch (DatabaseConnectionException ex) {
// etwas tun
} catch (DatabaseDataException ex) {
// etwas völlig anderes tun
} catch (DatabaseTangoException ex) {
// etwas völlig Außergewöhnliches tun
}
... dann funktionieren vielleicht Ihre fein granulierten Ausnahmen für Sie. Und wenn Sie diese drei Ausnahmen als Unterklassen von DatabaseDataException
deklarieren, können Sie die Fälle gemeinsam oder separat behandeln, je nach Bedarf.
Letztendlich liegt es an Ihnen, Ihr eigenes Urteil zu fällen, im Kontext Ihrer Anwendung.