En mi opinión, no es más que una de las razones de una construcción de objetos no debe ser seguido por (or "in" as Mason pointed out) un bloque try/finally
.
- Si la vida de un objeto está siendo administrada por otro objeto.
Esta gestión puede tomar tres formas:
- referencia de un objeto tiene un alcance más allá del bloque local y se libera otra parte - como un miembro campo liberado en el destructor.
- Objeto agregado inmediatamente a una lista que se encarga de liberar el objeto más tarde.
- Un objeto con un administrador de por vida asociado, por ejemplo, cómo pasar el propietario a un control de VCL en la construcción.
Con # 1, cuando la referencia tiene un alcance más amplio, la referencia debe regularse a cero inmediatamente si no se construye de inmediato. De esa manera, cuando se verifique para referencia, sabrá que tiene una lectura precisa. Esto es más común con los objetos miembros que se construyen como parte de una clase más grande, y luego se limpian cuando se destruye el objeto principal.
Con # 2, cuando se añade un objeto a una lista, que desea utilizar un bloque try-except
(una de las pocas veces que uso uno) por si acaso se produce una excepción después de que el objeto se construye y se antes de que se agregue a la lista de administración. Idealmente, la primera línea después de la construcción es agregarla a la lista, o la lista es en realidad una clase de fábrica que le da un objeto ya agregado a la lista.
Con # 3, cuando un objeto tiene otro gestor de toda la vida, que realmente debe asegurarse de que la maneje que el manager es lo que hay que hacer. Si está construyendo un control de VCL, puede tener la tentación de tener el formulario (o cualquier otro control) de su propiedad, pero eso realmente implica una sobrecarga adicional en la construcción y la destrucción. Si es posible, explícitamente debes liberarlo, esto es especialmente cierto si pones el control una vez, entonces sabes que lo liberarás en el destructor de tu formulario o cuando se cierre. La única vez que no puede hacer esto es si la creación de control es más dinámica.
Así que sí, es una buena práctica usar muchos bloques try/finally
. Solo debe tener unos pocos bloques try/except
, y la mayoría de ellos deberían atrapar tipos de excepción muy específicos y/o volver a generar la excepción. Si tiene más bloques try/except
que try/finally
, entonces lo está haciendo incorrectamente.
Muy buena respuesta. Y usted incluyó algunas cosas interesantes y destacadas que el OP no pensó preguntar. Como el problema de tener DEMASIADOS bloques gruesos "try..catch" que efectivamente matan su capacidad para administrar fallas de código, y salir limpiamente de las llamadas call-stack fallidas. –