webentwicklung-frage-antwort-db.com.de

Java-Run-Code nur, wenn in try and catch block keine Ausnahme ausgelöst wird

Wie mache ich es, damit der Code nur läuft, wenn keine Ausnahme ausgelöst wurde?

Mit finally läuft Code, ob es eine Ausnahme gab oder nicht.

try {
   //do something
} catch (Exception e) {}
//do something only if nothing was thrown
16
Muhammad Umer

Hier gibt es zwei Möglichkeiten:

try {
    somethingThatMayThrowAnException();
    somethingElseAfterwards();
} catch (...) {
    ...
}

Oder wenn Sie möchten, dass sich Ihr zweiter Codeblock außerhalb des try-Blocks befindet:

boolean success = false;
try {
    somethingThatMayThrowAnException();
    success = true;
} catch (...) {
    ...
}
if (success) {
    somethingElseAfterwards();
}

Sie können die if-Anweisung auch in einen finally-Block schreiben, aber Ihre Frage enthält nicht genügend Informationen, um festzustellen, ob dies vorzuziehen ist oder nicht.

41
khelwood
try {
    doSomething();
    doSomething2();
} catch (Exception e) {
    doSomething3();
}

In diesem Beispiel wird doSomething2() nur ausgeführt, wenn von doSomething() keine Ausnahme ausgelöst wird.

Wenn eine Ausnahme von doSomething() ausgelöst wird, wird doSomething2(); übersprungen und die Ausführung springt zu doSomething3();.

Beachten Sie auch, dass doSomething3() ausgeführt wird, wenn eine Ausnahme von doSomething2(); ausgelöst wird.

Wenn keine Ausnahme ausgelöst wird, wird doSomething3(); nicht ausgeführt.

17
ThePerson

Geben Sie einfach den Code in den try-Block ein. Wenn eine Ausnahme ausgelöst wird, wird zum catch-Block gesprungen. Wenn keine Ausnahme ausgelöst wird, wird der Code einfach ausgeführt.

try {
    someMethodThatMayThrowException();
    codeThatShouldBeRunIfNoExceptionThrown();
} catch (Exception e) {...}
3
pathfinderelite

Eine Verbesserung des Vorschlags

try {
    somethingThatMayThrowAnException();
    somethingElseAfterwards();
} catch (...) {
    ...
}

aus der akzeptierten Antwort. Was Sie tun sollten, ist:

void foo() {
  try {
    doStuff();
  } catch (...) {
    handleException();
  }
}

Das obige fühlt sich für jemanden als übertrieben an, der nicht dem "sauberen Code-Denken" ausgesetzt war. 

Aber der Punkt hier: Sie wollen nicht verschiedene Abstraktionen innerhalb einer Methode mischen. Mit anderen Worten: Sie haben keinen Try-Block und dahinter folgt mehr Code in derselben Methode. 

Sie stellen sicher, dass jede Methode einen direkten Pfad enthält - Sie vermeiden alles, was Ihren Lesefluss kompliziert. Sobald Sie sich daran gewöhnt haben, solche Art von Code zu schreiben und zu lesen, werden Sie feststellen, dass Sie erheblich weniger Zeit benötigen, um Ihren Code zu verstehen. 

1
GhostCat

Ausnahmen für die Flusskontrolle sind eine schlechte Praxis. Wenn Sie darauf bestehen, verwenden Sie eine Variable boolean.

boolean thrown = false;

try {
   //do something
} catch (Exception e) {
   thrown = true;
}

//do something only if nothing was thrown

if (!thrown) { 
    // do stuff
}
0
Adrian