2 Stimmen

Bricht eine Ausnahme innerhalb eines TRY-Blocks dessen Ausführung ab?

Ich importiere mehrere Felder, und zwar etwa 25 Codezeilen, die jeweils ein Feld importieren (in meinem Fall gibt es wirklich keine andere Möglichkeit). Es ist in einem Try-Catch-Block, aber es gibt einige Male, dass dieses Feld nicht in der Quelle vorhanden ist, aber ich muss den Rest bekommen.

vom 20.
Ich bekomme 10
die 11. gibt es nicht (Ausnahme) Ich brauche noch von 12 bis 20.

Für den Fall, dass ich nicht die Existenz einer nach dem anderen testen möchte, möchte ich wissen, wie Try funktioniert. im Falle einer Ausnahme, führt es nicht den Rest, richtig? was könnte für mich passen?

obs: Es sind weit mehr als 20, ich möchte eine intelligente und nichtpolizeiliche Lösung dafür.

5voto

Zoidberg Punkte 9833

Wenn eine Ausnahme innerhalb eines Try-Blocks auftritt, wird nichts nach der Ausnahme ausgeführt. Wenn also die Ausnahme bei Element 11 auftritt, werden die Elemente 12 bis 20 nicht ausgeführt. Die Ausführung springt von Element 11 zum Catch-Block und dann zum Finally-Block, wenn ein solcher vorhanden ist.

Aus Ihrer Frage geht hervor, dass Sie die Ausnahme erhalten, wenn ein Feld nicht vorhanden ist. Ich empfehle, zu prüfen, ob das Feld existiert, und dann den Vorgang auszuführen. Ich empfehle NICHT, einen Try-Catch als Mittel zur Überprüfung einer Existenzbedingung zu verwenden. Try-Catches sollten der Fehlerbehandlung dienen, und wenn Sie einen Fehler erhalten, wollen Sie normalerweise nicht mit der normalen Ausführung fortfahren. Wenn Ihnen die Idee nicht gefällt, die Bedingung in jeder Zeile zu prüfen, oder es keine andere Möglichkeit gibt, sie zu prüfen, als eine Ausnahme abzufangen, dann schlage ich vor, eine Hilfsfunktion mit der Try-Catch-Funktion zu erstellen, die

boolean checkField(field){
  try{/* do operation on field*/}
  catch(Exception e){return false;}
  return true;
}

void main(){
   if !(checkField(field1)) return;
   else if !(checkField(field2)) return;
   .
   .
   .
}

3voto

Kobi Punkte 129985

Ja, eine Ausnahme unterbricht den Try-Block - das ist der richtige Weg, sie zu behandeln.
Wenn Sie weitermachen wollen, brauchen Sie try/catch für jedes Feld. Das bedeutet nicht, dass Sie es 20 Mal schreiben müssen, im Gegenteil, Sie müssen Ihren Code refaktorisieren:

  • Fügen Sie eine Funktion hinzu, die das Feld (als String?) abruft und versucht, einen Wert zurückzugeben.
  • Erstellen Sie eine neue Klasse und definieren Sie jedes Feld als ein Objekt.
  • Lösen Sie überhaupt keine Ausnahme aus - wenn es sich um ein häufiges Szenario handelt, lösen Sie keine Ausnahme aus! Fügen Sie eine Prüfung hinzu, bevor Sie den Wert lesen. Auch hier hilft es, dies in eine Funktion zu verschieben.

1voto

Adriaan Stander Punkte 155899

Hier ist try-catch-finally

Ich würde trotzdem empfehlen, das Vorhandensein des Feldes zu überprüfen. Das ist sauberer und korrekter.

1voto

leppie Punkte 111830

Ausnahmen in einer Schleife sind ein Los langsamer als bei einer einfachen Überprüfung der Gültigkeit.

0voto

AdaTheDev Punkte 135097

Wenn in einem try-Block eine Ausnahme auftritt, springt er direkt in den catch-Block (wenn es keinen catch-Block gibt, springt er in den finally-Block und die Ausnahme wird aufgefangen. Der Code im try-Block NACH dem Auftreten des Fehlers wird also nicht ausgeführt.

Entweder:
1) Prüfen Sie vor jedem Versuch, ob das Feld vorhanden ist
2) jeden einzelnen Feldimport in ein eigenes try...catch verpacken

Ich würde mich für 1) entscheiden, um Ausnahmen von vornherein zu vermeiden.

Wenn Sie den Code zur Überprüfung des Vorhandenseins eines Feldes in eine separate, wiederverwendbare Methode umstrukturieren/aufteilen, ist das nicht wirklich ein großer Aufwand.

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