Hola Marcelo.
Este fin de semana tuve algo de tiempo libre para leer con detenimiento todo lo planteado por ti y Mario. ¡Cuántas cosas me gustaría decir! Como procurar la redacción en un sólo idioma y de manera más comprensible. O evitar en lo posible escribir métodos de más de 20 líneas de código. Pero intentaré enfocarme en lo principal de tu planteamiento técnico.
El uso canónico de un bloque Try-Finally es:
El uso canónico de un bloque Try-Except es:
El punto 6 consiste, generalmente, en tomar alguna diligencia de control, liberar algún recurso que previamente se cargó en memoria, registrar o reportar una bitácora de incidencias, o anexar/convertir la excepción en otra excepción. Pero casi siempre este tratamiento termina elevando una excepción (propagando la misma o instanciando otra) al llamador. En algunas ocasiones el punto 4 podría ser opcional.
Por otra parte, además de la muy mala práctica de
sofocar excepciones (atraparlas solo "para que no estorben"), existe cierta práctica no muy buena (y afortunadamente poco difundida) de atrapar una excepción para convertirla en un código de resultado. Nunca hagas eso a menos que no tengas alternativa. Es más válido que un método de aplicación envuelva a un método de API, atrapando una excepción de esa API para transformarla en una excepción más propia de la aplicación (algo que ya veo haces). Aunque también es válido dejar que la excepción original aparezca en la pantalla del usuario. Lo más malo es que aparezca cualquier mensaje de error, no que el mensaje de error sea algo "geek". Claro, podría ser deseable que las excepciones
digan algo entendible, pero no olvidemos que son eso: excepciones que no debieran presentarse.
Dada la introducción anterior, me permito poner en seudocódigo cómo podría ser tu método LoadMatrix:
Código Delphi
[-]
LoadMatrix
Begin
CheckMatrix (M); —Punto 1. Crear FileStream
Try
—Punto 2. Uso del FileStream:
Try
—Punto 5. Leer archivo, verificar datos y elevar excepciones de tu clase en caso de inconsistencias.
Except;
—Punto 6. Atrapar excepciones conocidas o esperadas de FileStream y convertirlas en una excepción de tu clase.
End;
Finally
—3. Destruir FileStream
End;
End;
Espero que esta participación sea de alguna ayuda.
