Je ne sais pas écureuil, mais même en l'absence d'un bloc enfin, vous pouvez simuler le comportement dans une certaine mesure au sein de 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 bloc de capture la exception dans une variable que vous peut tester plus tard si vous voulez le relancer, et il vous permet toujours de faire d'autres nettoyages. Évidemment, il y a des nuances dont vous devez être conscient (par exemple, des types explicites d'exceptions qui nécessitent une manipulation spéciale, plus d'exceptions étant lancées en dehors de l'essai/catch) mais avec un examen attentif, vous devriez être d'accord.
Les ressources système (comme les poignées graphiques, les sockets, les fenêtres, les poignées de fichiers, etc.) en particulier ont tendance à être un peu brouillon dans Java et d'autres langages collectés. Habituellement, ces ressources seront gérées par une classe avec une méthode close() explicite. Donc, si vous savez que les choses sont tombées dans un tas, vous devez normalement invoquer une fermeture explicite() sur les objets pour les nettoyer immédiatement. Sinon, l'objet se nettoiera pendant la finalisation, mais seulement pendant GC, ce qui pourrait prendre du temps.
Fait sens. C'est seulement problématique quand vous renommez des exceptions (le code n'atteindra pas votre instruction 'if' dans ce cas). Et en passant, 'enfin' en Java serait appelé même quand aucune exception n'était levée, donc ce ne serait pas ce que je voulais de toute façon. Il s'avère que votre méthode serait encore plus utile que 'finally'. * soupir * Longue vie à la gestion de la mémoire de C++/C++ 0x. –