824 Stimmen

Kann ich mehrere Java-Ausnahmen im selben catch-Block abfangen?

In Java möchte ich so etwas tun:

try {
    ...     
} catch (/* Code zum Fangen von IllegalArgumentException, SecurityException,
            IllegalAccessException und NoSuchFieldException zur gleichen Zeit */) {
   someCode();
}

...statt:

try {
    ...     
} catch (IllegalArgumentException e) {
    someCode();
} catch (SecurityException e) {
    someCode();
} catch (IllegalAccessException e) {
    someCode();
} catch (NoSuchFieldException e) {
    someCode();
}

Gibt es einen Weg, dies zu tun?

11voto

Oleg Vaskevich Punkte 11978

Eine sauberere (aber weniger ausführliche und vielleicht nicht so bevorzugte) Alternative zu der Antwort von user454322 in Java 6 (d.h. Android) wäre es, alle Exceptions abzufangen und RuntimeExceptions neu zu werfen. Dies würde nicht funktionieren, wenn Sie planen, andere Arten von Ausnahmen weiter oben im Stapel abzufangen (es sei denn, Sie werfen sie auch neu), aber es würde effektiv alle geprüften Ausnahmen abfangen.

Zum Beispiel:

try {
    // CODE, DAS EINE AUSNAHME WIRFT
} catch (Exception e) {
    if (e instanceof RuntimeException) {
        // diese Ausnahme wurde nicht erwartet, also werfen Sie sie neu
        throw e;
    } else {
        // IHR CODE FÜR ALLE GEPRÜFTEN AUSNAHMEN
    } 
}

Das gesagt, für die Ausführlichkeit wäre es vielleicht am besten, einen booleschen Wert oder eine andere Variable zu setzen und basierend darauf nach dem try-catch-Block einige Codezeilen auszuführen.

4voto

Bill S Punkte 49

Im Pre-7 wie wäre es mit:

  Boolean   caught = true;
  Exception e;
  try {
     ...
     caught = false;
  } catch (TransformerException te) {
     e = te;
  } catch (SocketException se) {
     e = se;
  } catch (IOException ie) {
     e = ie;
  }
  if (caught) {
     someCode(); // Sie können die Ausnahme e hier referenzieren.
  }

4voto

Hardik Shah Punkte 31

Es ist sehr einfach:

versuchen {
  // Dein Code hier.
} fangen (IllegalArgumentException | SecurityException | IllegalAccessException |
            NoSuchFieldException e) {
  // Behandle die Ausnahme hier.
}

3voto

Dr.jacky Punkte 2937

Für Kotlin ist es momentan nicht möglich, aber sie haben überlegt, es hinzuzufügen: Quelle
Aber für jetzt, nur ein kleiner Trick:

try {
    // Code
} catch(ex:Exception) {
    when(ex) {
        is SomeException,
        is AnotherException -> {
            // Behandlung
        }
        else -> throw ex
    }
}

0voto

Vineet Reynolds Punkte 74302

Fangen Sie die Ausnahme ein, die sich als Elternklasse in der Ausnahme-Hierarchie befindet. Das ist natürlich schlechte Praxis. In Ihrem Fall ist die gemeinsame Elternausnahme die Exception-Klasse, und das Fangen einer Ausnahme, die eine Instanz von Exception ist, ist in der Tat schlechte Praxis - Ausnahmen wie NullPointerException sind in der Regel Programmierfehler und sollten in der Regel durch Überprüfen auf Nullwerte behoben werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X