Wie reagieren Abwickeln zu stapeln, wenn Destruktoren werden nicht von einer Sprache unterstützt?

StackOverflow https://stackoverflow.com/questions/3879755

Frage

Angenommen, Sie eine Instanz einer Klasse Window angelegt haben. Das Fenster wird dem Benutzer angezeigt. Dann wird eine Ausnahme ausgelöst, und Verweis auf die Instanz verloren, aber das Fenster ist immer noch für den Benutzer sichtbar, weil die Instanz noch existiert (es ist einfach nicht mehr verwiesen wird).

Was unter diesen Umständen tun?

Ich spreche speziell über die Eichhörnchen-Skriptsprache (http://www.squirrel-lang.org/). Im Gegensatz zu Java, es scheint nicht finally Blöcke oder Finalizerthread Methoden zu haben, so ist Ausnahme in dieser Sprache gebrochen Handhabung?

War es hilfreich?

Lösung

Ich weiß nicht, Eichhörnchen, aber auch in Abwesenheit eines schließlich blockieren Sie das Verhalten zu einem gewissen Grad in Java simulieren können:

Exception error = null;
try {
 // do something
}
catch (Exception e) {
  error = e;
}
// My finally code goes here
// ...
if (error != null) {
  // Oh dear clean up all my resources - files, windows, sockets etc.
  throw error;
}

So der catch-Block speichert die Ausnahme in einer Variablen, die Sie später testen können, wenn Sie es erneut auslösen sollen, und ermöglicht es Ihnen, nach wie vor die Möglichkeit, andere Bereinigungen zu tun. Offensichtlich gibt es Nuancen, dass Sie sich bewusst sein müssen (zum Beispiel explizite Arten von Ausnahme, die eine besondere Behandlung benötigen, mehr Ausnahmen außerhalb des try / catch geworfen werden), aber mit sorgfältiger Überlegung sollten Sie in Ordnung sein.

Systemressourcen (wie Grafiken Griffe, Steckdosen, Fenster, Datei-Handles etc.) insbesondere dazu neigen, ein bisschen chaotisch in Java und anderen Müll gesammelt Sprachen zu sein. Normalerweise werden diese Ressourcen durch eine Klasse mit einer expliziten Methode close () verwaltet werden. Also, wenn Sie wissen, was in einem Haufen gefallen würden Sie normalerweise invoke eine explizite close () auf die Objekte, um sie sofort zu bereinigen. Andernfalls wird das Objekt Bereinigung selbst bei der Finalisierung aber nur während der GC das eine lange Zeit kommen könnte.

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