Me alegra que hayas publicado esto como una pregunta. :)
Estaba tratando de decir que los destructores y finallyconceptualmente son diferentes:
- Los destructores son para liberar recursos ( datos )
finallyes para volver a la persona que llama ( control )
Considere, digamos, este pseudocódigo hipotético:
try {
bar();
} finally {
logfile.print("bar has exited...");
}
finallyaquí está resolviendo completamente un problema de control y no un problema de gestión de recursos.
No tendría sentido hacer eso en un destructor por una variedad de razones:
- No lo está siendo "adquirida" o "creado"
- Si no se imprime en el archivo de registro no se producirán fugas de recursos, corrupción de datos, etc. (suponiendo que el archivo de registro aquí no se envíe al programa en otro lugar)
- Es legítimo
logfile.printfracasar, mientras que la destrucción (conceptual) no puede fallar
Aquí hay otro ejemplo, esta vez como en Javascript:
var mo_document = document, mo;
function observe(mutations) {
mo.disconnect(); // stop observing changes to prevent re-entrance
try {
/* modify stuff */
} finally {
mo.observe(mo_document); // continue observing (conceptually, this can fail)
}
}
mo = new MutationObserver(observe);
return observe();
En el ejemplo anterior, nuevamente, no hay recursos para liberar.
De hecho, el finallybloque está adquiriendo recursos internamente para lograr su objetivo, lo que podría fallar. Por lo tanto, no tiene sentido usar un destructor (si Javascript tenía uno).
Por otro lado, en este ejemplo:
b = get_data();
try {
a.write(b);
} finally {
free(b);
}
finallyestá destruyendo un recurso, b. Es un problema de datos. El problema no se trata de devolver limpiamente el control a la persona que llama, sino de evitar pérdidas de recursos.
El fracaso no es una opción, y nunca (conceptualmente) debería ocurrir.
Cada lanzamiento de bnecesariamente está emparejado con una adquisición, y tiene sentido usar RAII.
En otras palabras, solo porque puede usar cualquiera para simular eso no significa que ambos son el mismo problema o que ambos son soluciones apropiadas para ambos problemas.