206 Stimmen

Sollte versuchen...fangen innerhalb oder außerhalb einer Schleife zu gehen?

Ich habe eine Schleife, die in etwa so aussieht:

for (int i = 0; i < max; i++) {
    String myString = ...;
    float myNum = Float.parseFloat(myString);
    myFloats[i] = myNum;
}

Dies ist der Hauptinhalt einer Methode, deren einziger Zweck es ist, das Array von Floats zurückzugeben. Ich möchte, dass diese Methode zurückgibt null wenn ein Fehler auftritt, also habe ich die Schleife in eine try...catch Block, etwa so:

try {
    for (int i = 0; i < max; i++) {
        String myString = ...;
        float myNum = Float.parseFloat(myString);
        myFloats[i] = myNum;
    }
} catch (NumberFormatException ex) {
    return null;
}

Aber dann habe ich auch daran gedacht, die try...catch Block innerhalb der Schleife, etwa so:

for (int i = 0; i < max; i++) {
    String myString = ...;
    try {
        float myNum = Float.parseFloat(myString);
    } catch (NumberFormatException ex) {
        return null;
    }
    myFloats[i] = myNum;
}

Gibt es irgendeinen Grund, der dafür spricht, das eine dem anderen vorzuziehen, sei es aus Leistungsgründen oder aus anderen Gründen?


Edit : Der Konsens scheint zu sein, dass es sauberer ist, die Schleife innerhalb der try/catch zu platzieren, möglicherweise innerhalb einer eigenen Methode. Es gibt jedoch immer noch eine Debatte darüber, was schneller ist. Kann jemand dies testen und mit einer einheitlichen Antwort zurückkommen?

2 Stimmen

Ich weiß nicht, wie es um die Leistung bestellt ist, aber der Code sieht mit dem Try-Catch außerhalb der for-Schleife sauberer aus.

5voto

user19810 Punkte 51

Wie bereits erwähnt, ist die Leistung die gleiche. Die Benutzererfahrung ist jedoch nicht unbedingt identisch. Im ersten Fall werden Sie schnell scheitern (d. h. nach dem ersten Fehler). Wenn Sie jedoch den try/catch-Block in die Schleife einfügen, können Sie alle Fehler abfangen, die bei einem bestimmten Aufruf der Methode auftreten würden. Beim Parsen eines Arrays von Werten aus Zeichenketten, bei denen Sie einige Formatierungsfehler erwarten, gibt es definitiv Fälle, in denen Sie dem Benutzer alle Fehler anzeigen möchten, damit er nicht versuchen muss, sie einzeln zu beheben.

0 Stimmen

Das gilt zwar nicht für diesen speziellen Fall (ich kehre in den Catch-Block zurück), aber es ist gut, wenn man das generell im Hinterkopf behält.

4voto

Joe Skora Punkte 14359

Wenn es ein Alles-oder-Nichts-Fail ist, dann ist das erste Format sinnvoll. Wenn Sie in der Lage sein wollen, alle nicht fehlgeschlagenen Elemente zu verarbeiten/zurückzugeben, müssen Sie die zweite Form verwenden. Das wären meine grundlegenden Kriterien für die Wahl zwischen den beiden Methoden. Wenn es sich um ein Alles-oder-Nichts-Verfahren handelt, würde ich persönlich nicht die zweite Form verwenden.

4voto

Solange Sie sich darüber im Klaren sind, was Sie in der Schleife erreichen müssen, können Sie den Try-Catch außerhalb der Schleife platzieren. Es ist jedoch wichtig zu verstehen, dass die Schleife dann endet, sobald die Ausnahme auftritt, und das ist vielleicht nicht immer das, was Sie wollen. Dies ist tatsächlich ein sehr häufiger Fehler in Java-basierter Software. Man muss eine Reihe von Elementen verarbeiten, z. B. eine Warteschlange leeren, und verlässt sich fälschlicherweise darauf, dass eine äußere try/catch-Anweisung alle möglichen Ausnahmen behandelt. Sie könnten auch nur eine bestimmte Ausnahme innerhalb der Schleife behandeln und nicht erwarten, dass eine andere Ausnahme auftritt. Wenn dann eine Ausnahme auftritt, die nicht innerhalb der Schleife behandelt wird, wird die Schleife "vorzeitig" beendet und die äußere catch-Anweisung behandelt die Ausnahme.

Wenn die Schleife die Aufgabe hat, eine Warteschlange zu leeren, dann könnte die Schleife sehr wahrscheinlich enden, bevor diese Warteschlange wirklich geleert wurde. Ein sehr häufiger Fehler.

3voto

surendrapanday Punkte 394

Meiner Meinung nach sind try/catch-Blöcke notwendig, um eine ordnungsgemäße Ausnahmebehandlung zu gewährleisten, aber die Erstellung solcher Blöcke hat Auswirkungen auf die Leistung. Da Schleifen intensive, sich wiederholende Berechnungen enthalten, ist es nicht empfehlenswert, try/catch-Blöcke in Schleifen einzufügen. Außerdem scheint es so zu sein, dass dort, wo diese Bedingung auftritt, oft eine "Exception" oder "RuntimeException" abgefangen wird. Das Abfangen von RuntimeException im Code sollte vermieden werden. Auch hier gilt: Wenn Sie in einem großen Unternehmen arbeiten, ist es wichtig, diese Ausnahme ordnungsgemäß zu protokollieren, damit keine RuntimeException auftritt. Der ganze Sinn dieser Beschreibung ist PLEASE AVOID USING TRY-CATCH BLOCKS IN LOOPS

0 Stimmen

Ja, dies ist die beste allgemeine Antwort, vollständig zu vermeiden Try/Catch in Schleifen ist überprüfbar mit einem Qualitätswerkzeug und wird sicherstellen, dass u nie eine Ausnahme pro Iteration (die eine große Leistung Problem IST) erstellen

2voto

Joel Coehoorn Punkte 377088

Wenn Sie das Try/Catch innerhalb der Schleife platzieren, wird die Schleife nach einer Ausnahme fortgesetzt. Wenn Sie es außerhalb der Schleife setzen, stoppen Sie, sobald eine Ausnahme ausgelöst wird.

0 Stimmen

Nun, ich bin Rückgabe null auf Ausnahme, so dass es nicht halten Verarbeitung in meinem Fall.

0 Stimmen

Zumindest in Python hängt es davon ab, was die Ausnahme zurückgibt. Wenn die Exception einen Exit ungleich Null auslöst, würde sie die Schleife verlassen.

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