"quasi-finally" für funktionen

broetchen

Erfahrenes Mitglied
moin

Entschuldigt bitte den Titel, mir ist nichts besseres eingefallen.

Bei einem Try-Catch-Block kann man ja einen finally-Block anhängen, der auf jeden fall ausgeführt wird.

Der erste Befehl in meiner Funktion ist das öffnen eines Files und der letzte (bevor dem return) das schließen.
Während des Ablaufes nehme ich ein paar Überprüfungen vor und löse, abhängig vom Ergebnis der Überprüfung, eine Exception aus.

Wenn ich diese Exception nun werfe, wird mein Close nicht mehr aufgerufen.
Kann ich jetzt irgendwie deklarieren, dass egal, wo die Funktion verlassen wird, das Close auf jeden Fall aufgerufen wird (eben so ne art finally)!?

mfg broetchen
 
Code:
try {
    file öffnen  // fehler
} catch { Exception ex) {
   // fehler abfangen
} finally {
  file schließen
}
return whatever;
 
Es geht nicht darum, dass beim Öffnen des files ein Fehler auftritt, sonder, dass wenn ich selber eine neue Exception erzeuge und werfe ich nicht mehr dazu komme, das file wieder zu schließen.

Gibt's keinen Bereich, der auf jedem Fall ausgeführt wird, bevor die Funktion, warum auch immer, verlassen wird!?

mfg broetchen
 
Here we go ...
Code:
try {
  // fehlerhafter code
} catch Exception (ex) {
  // close your file here
  throw new BlaBlaException(ex.Message);
}
 
Was daran verstehst du bitte nicht?
Bevor du deine Exception wirfst (und nachdem du sie selbst wirfst, weißt du ja WO das passiert) schließt du einfach das File. Wo bitte ist da das Problem
 
Es ist kein Problem. Ich wollte nur wissen, ob es eine möglichkeit gibt, so etwas automatisch erledigen zu lassen.
Ich mag nunmal eleganten Code, der gut strukturiert und lesbar ist.
Wenn da dann vor jedem verdammten throw ein Close steht bläht das den Code auf.

Aber wenn es so etwas nicht gibt, dann werde ich nicht drumherum kommen.
Ich dachte mir nur, dass wenn es bei try-catch-blöcken ein finally gibt, könnte es ja sein, dass man so etwas ähnliches hier vielleicht auch eingebaut hat.

Schaut doch besser aus, wenn man an einem zentralen Punkt bescheid sagt, was alles auf jeden Fall bei beenden der Funktion (egal, warum sie beendet wird) erledigt werden soll, oder etwa nicht!?

mfg broetchen
 
Es gäbe schon einen Ansatz:

Du leitest Exception ab und erweiterst dies um eine Referenz auf dein File. Für die Überprüfungen und den dadurch notwendigen Exceptions leitest eben von dieser abgeleiteten Exception ab und übergibst denen zum Ersten eine Message und zum Zweiten eine Referenz auf die Datei. Und die Datei wird dann eben in der Exception geschlossen.

Ob das eine saubere Lösung ist .. nun, ich glaube nicht. Aber so würdest es an einem Punkt machen. Dafür sind Exceptions aber ansich nicht gedacht.
 
Zurück