Come reagire a impilare rilassarsi quando i distruttori non sono supportati da un linguaggio?

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

Domanda

Si supponga di aver creato un'istanza di una classe Window. La finestra viene mostrato all'utente. Poi, viene generata un'eccezione, e si perde riferimento all'istanza, ma la finestra è ancora visto da parte dell'utente perché l'istanza esiste ancora (non è solo riferimento più).

Cosa fare in queste circostanze?

Sono in particolare parlando del linguaggio di scripting Squirrel (http://www.squirrel-lang.org/). Contrariamente a Java, non sembra avere blocchi finally o metodi Finalizer, lo è anche la gestione delle eccezioni rotto in questa lingua?

È stato utile?

Soluzione

Non so scoiattolo, ma anche in assenza di un blocco finally è possibile simulare il comportamento in una certa misura all'interno di Java:

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;
}

Quindi i negozi blocco Catch l'eccezione in una variabile che è possibile verificare in seguito, se si vuole rigenerare esso, e si permette ancora la possibilità di fare altre pulizia. Ovviamente ci sono sfumature che si deve essere a conoscenza di (per esempio tipi espliciti d'eccezione che hanno bisogno di un trattamento speciale, più eccezioni sono gettati fuori dal try / catch), ma con un attento esame si dovrebbe essere a posto.

Le risorse di sistema (come le maniglie grafica, prese, finestre, maniglie di file, ecc), in particolare, tendono ad essere un po 'disordinato in Java e altri rifiuti raccolti lingue. Di solito queste risorse saranno gestite da una classe con un metodo esplicito close (). Quindi, se si sa le cose sono caduti in un mucchio che normalmente richiamare un esplicito close () sugli oggetti a loro ripulire immediatamente. Altrimenti l'oggetto volontà pulitura stessa durante la finalizzazione ma solo durante GC che potrebbe essere un lungo tempo a venire.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top