In Java möchte ich so etwas tun:
try {
...
} catch (/* code to catch IllegalArgumentException, SecurityException,
IllegalAccessException, and NoSuchFieldException at the same time */) {
someCode();
}
...anstatt:
try {
...
} catch (IllegalArgumentException e) {
someCode();
} catch (SecurityException e) {
someCode();
} catch (IllegalAccessException e) {
someCode();
} catch (NoSuchFieldException e) {
someCode();
}
Gibt es eine Möglichkeit, dies zu tun?
java
exception
try-catch
multi-catch
froadie
quelle
quelle
bitwise or
(|
) neu definieren ? Warum nicht ein Komma oder den Operator verwenden, der eine ähnlichere Bedeutung hat, daslogical or
(||
)?Nicht genau vor Java 7, aber ich würde so etwas tun:
Java 6 und früher
Java 7
quelle
exc.getCause()
. Als Randnotiz empfiehlt Robert C. Martin (unter anderem), ungeprüfte Ausnahmen zu verwenden (der Compiler hat keine Ahnung, welche Art von Ausnahme von dort ausgelöst wird). Siehe Kapitel 7: Fehlerbehandlung in seinem Buch Code reinigen .throw exc
anstelle vonthrow new RuntimeException(exc)
?In Java 7 können Sie mehrere catch-Klauseln definieren, z.
quelle
Wenn es eine Hierarchie von Ausnahmen gibt, können Sie die Basisklasse verwenden, um alle Unterklassen von Ausnahmen abzufangen. Im entarteten Fall können Sie alle Java-Ausnahmen abfangen mit:
In einem häufigeren Fall, wenn RepositoryException die Basisklasse und PathNotFoundException eine abgeleitete Klasse ist, gilt Folgendes:
Der obige Code fängt RepositoryException und PathNotFoundException für eine Art der Ausnahmebehandlung ab, und alle anderen Ausnahmen werden zusammengefasst. Seit Java 7 gemäß der obigen Antwort von @ OscarRyz:
quelle
Nein, eine pro Kunde.
Sie können eine Oberklasse wie java.lang.Exception abfangen, solange Sie in allen Fällen dieselbe Aktion ausführen.
Dies ist jedoch möglicherweise nicht die beste Vorgehensweise. Sie sollten eine Ausnahme nur dann abfangen, wenn Sie eine Strategie für die tatsächliche Behandlung haben - und Protokollieren und erneutes Werfen bedeutet nicht "Behandeln". Wenn Sie keine Korrekturmaßnahme haben, fügen Sie diese besser der Methodensignatur hinzu und lassen Sie sie an jemanden weitergeben, der mit der Situation umgehen kann.
quelle
Eine sauberere (aber weniger ausführliche und möglicherweise nicht bevorzugte) Alternative zur Antwort von user454322 auf Java 6 (dh Android) wäre, alle
Exception
s zu fangen und s erneut zu werfenRuntimeException
. Dies würde nicht funktionieren, wenn Sie planen, andere Arten von Ausnahmen weiter oben im Stapel abzufangen (es sei denn, Sie werfen sie auch erneut), sondern alle effektiv abgefangen Ausnahmen .Zum Beispiel:
Aus Gründen der Ausführlichkeit ist es jedoch möglicherweise am besten, einen Booleschen Wert oder eine andere Variable festzulegen und basierend darauf nach dem try-catch-Block Code auszuführen.
quelle
In Pre-7 wie wäre es mit:
quelle
caught
in einenfinally
Block einzufügen ?Ja. Hier ist der Weg mit dem Rohrabscheider (|):
quelle
Für Kotlin ist es momentan nicht möglich, aber sie haben darüber nachgedacht, es hinzuzufügen: Quelle
Aber im Moment nur ein kleiner Trick:
quelle
Fangen Sie die Ausnahme ab, die zufällig eine übergeordnete Klasse in der Ausnahmehierarchie ist. Dies ist natürlich eine schlechte Praxis . In Ihrem Fall ist die allgemeine übergeordnete Ausnahme zufällig die Exception-Klasse, und das Abfangen einer Ausnahme, die eine Instanz von Exception ist, ist in der Tat eine schlechte Praxis. Ausnahmen wie NullPointerException sind normalerweise Programmierfehler und sollten normalerweise durch Überprüfen auf Nullwerte behoben werden.
quelle