Frage

Gibt es eine Möglichkeit zu erkennen, aus der schließlich Klausel, dass eine Ausnahme in dem Prozess geworfen zu werden?

Sehen Sie das folgende Beispiel:


try {
    // code that may or may not throw an exception
} finally {
    SomeCleanupFunctionThatThrows();
    // if currently executing an exception, exit the program,
    // otherwise just let the exception thrown by the function
    // above propagate
}

oder ist eine der Ausnahmen das einzige, was zu ignorieren Sie tun?

In C ++ es nicht einmal können Sie eine der Ausnahmen ignorieren und nur Anrufe beenden (). Die meisten anderen Sprachen verwenden die gleichen Regeln wie Java.

War es hilfreich?

Lösung

Legen Sie ein Flag-Variable, dann überprüfen Sie es in der finally, etwa so:

boolean exceptionThrown = true;
try {
   mightThrowAnException();
   exceptionThrown = false;
} finally {
   if (exceptionThrown) {
      // Whatever you want to do
   }
}

Andere Tipps

Wenn Sie sich dies zu tun finden, dann könnten Sie ein Problem mit Ihrem Design. Die Idee eines „endlich“ Block ist, dass Sie etwas getan wollen, unabhängig davon, wie das Verfahren beendet. Scheint mir, wie Sie schließlich überhaupt nicht blockieren müssen, und sollen nur die Try-Catch-Blöcke verwenden:

try {
   doSomethingDangerous(); // can throw exception
   onSuccess();
} catch (Exception ex) {
   onFailure();
}

Wenn eine Funktion wirft und Sie die Ausnahme fangen, werden Sie die Funktion in einem Try-Block wickeln müssen, dann ist es der sicherste Weg. Also in Ihrem Beispiel:

try {
    // ...
} finally {
    try {
        SomeCleanupFunctionThatThrows();
    } catch(Throwable t) { //or catch whatever you want here
        // exception handling code, or just ignore it
    }
}

Haben Sie meinen Sie wollen, dass die schließlich blockieren, anders zu handeln, je nachdem, ob der try-Block erfolgreich abgeschlossen?

Wenn ja, man konnte immer so etwas wie:

boolean exceptionThrown = false;
try {
    // ...
} catch(Throwable t) {
    exceptionThrown = true;
    // ...
} finally {
    try {
        SomeCleanupFunctionThatThrows();
    } catch(Throwable t) { 
        if(exceptionThrown) ...
    }
}

Das ist immer ziemlich gewunden, obwohl ... möchten Sie vielleicht einen Weg denken, um Ihren Code restrukturieren diese überflüssig machen zu tun.

Nein, ich glaube nicht. Der catch-Block wird bis zur Fertigstellung vor dem finally-Block ausgeführt werden.

try {
    // code that may or may not throw an exception
} catch {
// catch block must exist.
finally {
    SomeCleanupFunctionThatThrows();
// this portion is ran after catch block finishes
}

Ansonsten können Sie synchronisieren add () Objekt, das der Ausnahmecode verwendet, dass Sie in dem finally-Block überprüfen können, was Sie würde helfen, festzustellen, ob in einem separaten Thread eine Ausnahme ausgeführt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top