Comment réagir face à la pile lorsque le déroulement Destructeurs ne sont pas supportées par une langue?

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

Question

Supposons que vous avez créé une instance d'une classe Window. La fenêtre est affichée à l'utilisateur. Ensuite, une exception est levée, et la référence à l'instance est perdue, mais la fenêtre est toujours visible par l'utilisateur car l'instance existe toujours (il est tout simplement pas plus référencé).

Que faire dans ces circonstances?

Je parle plus précisément le langage de script écureuil (http://www.squirrel-lang.org/). Contrairement à Java, il ne semble pas avoir des blocs de finally ou méthodes finaliseur, est donc la gestion des exceptions cassé dans cette langue?

Était-ce utile?

La solution

Je ne sais pas écureuil, mais même en l'absence d'un bloc enfin, vous pouvez simuler le comportement dans une certaine mesure, dans 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;
}

Ainsi, les magasins de blocs de capture l'exception dans une variable que vous pouvez tester plus tard si vous voulez réémettre, et il vous permet encore la chance de faire autre nettoyage. De toute évidence, il y a des nuances que vous devez être au courant (par exemple explicites types d'exception qui ont besoin d'un traitement spécial, plus d'exceptions jetés en dehors du try / catch), mais avec une attention particulière, vous devriez être bien.

ressources du système (comme les poignées graphiques, prises, fenêtres, poignées de fichiers, etc.) en particulier ont tendance à être un peu en désordre de Java et d'autres langages déchets collectés. Habituellement, ces ressources seront gérées par une classe avec une méthode proche explicite (). Donc, si vous savez que les choses sont tombées dans un tas que vous auriez normalement invoquer une fermeture explicite () sur les objets pour les nettoyer immédiatement. Sinon, le nettoyage de l'objet lui-même volonté lors de la finalisation, mais seulement pendant GC qui pourrait être une longue période à venir.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top