2010-11-26 1 views
3

platziert habe, habe ich eine Frage bezüglich der Ausnahmebehandlung und des Ressourcenmanagements und ich frage mich, ob irgendjemand ihre Meinung teilen könnte. Ich muss eine Reihe von Aktionen durchführen: App-Einstellungen lesen, die Umgebung einrichten, das Zeug machen und dann schließlich aufräumen. Bei der Bereinigung muss die Umgebung abgerissen werden. Dies sollte jedoch nur dann geschehen, wenn sie erfolgreich eingerichtet wurde.Reinigen Sie, bevor Sie Unordnung machen? Nachdem ich den Cleanup-Code innerhalb des Blocks

Hier ist mein erster (und lahm) Ansatz:

try { 
readSettings(); 
setupEnvironment(); 
} catch (Exception ex) { 
logStackTrace(ex); 
displayError(ex); 
closeCommThreads(); 
return; 
} 

try { 
// do stuff 
} catch (Exception ex) { 
logStackTrace(ex); 
displayError(ex); 
} finally { 
teardownEnvironment(); 
closeCommThreads(); 
} 

Das ist ein bisschen hässlich sein schien, so für eine bessere Lösung, die ich beschlossen, zu suchen. Ich habe etwas Hintergrund lesen und ziemlich viele Artikel stimmen für größere try/catch Blöcke und Verwendung (ein Wortspiel?) finally für die Bereinigung. Also hier ist mein zweiter Versuch:

try { 
readSettings(); 
setupEnvironment(); 
// do stuff 
} catch (Exception ex) { 
logStackTrace(ex); 
displayError(ex); 
} finally { 
teardownEnvironment(); 
closeCommThreads(); 
} 

Um diese Arbeit zu machen, hatte ich aus teardownEnvironment() sequenzieller Kupplung zu entfernen, so dass sie jederzeit aufgerufen werden können - vor oder nach setupEnvironment() (für die Redaktion: eine Möglichkeit, es besser setzen). Ist das der richtige Ansatz? Ich fühle mich ein bisschen komisch, vor dem Aufbau abzubauen.

Edit:

Nur um es etwas deutlicher: Ich entfernte sequentielle Kopplung durch eine zusätzliche Prüfung innerhalb teardownEnvironment einschließlich - so etwas wie if (!isSetup()) return;.

+0

Anstatt doppelte Fragen zu öffnen, können Sie den handlichen 'edit' Link unten verwenden;) –

+0

Yeah, yeah - Ich habe das gemacht und dann Browser * back * benutzt und versehentlich ein zweites Mal gepostet:/Entschuldigung. Hey, zumindest hatte ich endlich die Chance, * delete * button zu benutzen;) – lukem00

+0

ja, der delete-Button hat mich dazu gebracht, meine Antwort nicht mehr zu schreiben und stattdessen diesen Post zu finden. –

Antwort

1

Nun Regel Ihre teardownEnvironment() würde prüfen

isEnvironmentSetCorrectly() oder if(environment != null) oder was auch immer ähnlich

, bevor Sie sich beginnen zu reißen.

So müssen Sie nicht "fühlen sich leicht komisch" darüber, da es nicht passieren wird, wenn es richtig gemacht wird.

+0

Es tut - das ist, was ich damit meinte, dass ich die sequenzielle Kopplung entfernte. Ich frage mich nur, ob es nicht besser wäre, es explizit zu überprüfen, wo ich Teardown aufrufe, anstatt es in die Methode einzufügen. – lukem00

2

Weder ist rechts oder falsch, wenn beide Möglichkeiten erreichen, was Sie vorhaben zu tun.

Meiner Meinung nach ist der zweite Ansatz (großer try/catch/finally Block) einfacher zu lesen, weil Sie keine Rückgabeanweisung "versteckt" in einem catch-Block irgendwo in Ihrem Methodenkörper haben.

Darüber hinaus denke ich, das Entfernen der gegenseitigen Abhängigkeiten zwischen Methoden (Teardown, Setup) ist im Allgemeinen eine gute Übung (z. B. können Sie diese Methoden unabhängig testen). Nur Ausfahrt aus Teardown wenn nichts ist aufgebaut - keine Notwendigkeit, seltsam zu fühlen, darüber :)

2

Der finally Ansatz verwendet wird, eine Garantie haben, dass vor eine Ausnahme ausgelöst wird, verwendet die Ressourcen geschlossen werden kann/dereferenzierte (und bereit für die Müllabfuhr). Dies ist nur zu fördern exception safety.

Was Sie gerade besprochen haben, heißt Dispose Pattern. Aufgrund der automatischen Art des Java-GC führen Sie eine Ressourcenbereinigung für die Laufzeitumgebung durch.

Ihr zweiter Ansatz ist richtig (das ist ein Entsorgen Muster ist), wie Sie effektiv sind Ihre Umgebung mit tearDownEnvironment() Reinigung, alle Ressourcen zu schließen, bevor die JVM GC tritt in

Zusätzliche Informationen:. Resource Acquisition Is Initializationkonnte erleuchte dich?

Verwandte Themen