Mientras que la anidación del try...except
Dentro de un try...finally
(o viceversa) responde directamente a la pregunta, me gustaría señalar que la pregunta original, independientemente del idioma que esté usando, está mezclando las preocupaciones del error. manejo y manejo de recursos. Try...except
y try...finally
son feos. Te distraen de lo que hace tu código. Un mejor enfoque es extraer el control de errores en un método separado:
procedure Read(Connection: TDBConnection);
begin
try
//Read DB
except
//Handle Exception
end;
end;
procedure ReadRecord;
begin
DBConnection.Open;
Read(DBConnection);
DBConnection.Close;
end;
Ahora su gestión de errores es autónomo y puede ser ignorada para que pueda concentrar su atención en el camino feliz.
¡Espera! ¿Qué pasa con el open
y el close
? ¿Qué pasa si generan excepciones?
Simple. Envuelva esas operaciones en el intento ... excepto las funciones y trátelas también. No debería ser necesario. Si la biblioteca de DB que utiliza vale algo, una excepción en un open
o close
no dejará la conexión en un estado desconocido. Por otra parte, las excepciones están ahí para las cosas que no espera.
La misma técnica se puede utilizar con cualquier recurso: creación de objetos, acceso a archivos, etc. Cuando se garantiza que el cuerpo de su función no genera una excepción, no es necesario try...finally
.
Por supuesto, hay una sobrecarga de llamada de función, pero en la mayoría de los casos es insignificante y las funciones de manejo de errores deben ser lo suficientemente pequeñas como para permitir que el compilador las alinee.
Porque 'finally' y' except' son semánticamente totalmente diferentes, en Delphi no pueden estar en la misma declaración. Basta con mirar las fuentes RTL/VCL donde 'finally' y' except' se usan (y su proporción). Apenas verá los lugares donde están cerca. –
No ponga "commit transaction" en un bloque 'finally'. Si se produce una excepción, no desea confirmar nada. En especial, no desea intentar comprometer una transacción que ya realizó en el bloque 'except' anterior. Commit debe ser la acción final en la sección 'try'. –