Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Lazarus, FreePascal, Kylix, etc. (https://www.clubdelphi.com/foros/forumdisplay.php?f=14)
-   -   Excepciones en Lazarus (https://www.clubdelphi.com/foros/showthread.php?t=89727)

cd.rafael 25-01-2016 18:19:22

Excepciones en Lazarus
 
Cordial saludo,

He visto en varios foros y páginas que hay un problema con el manejo de excepciones en Lazarus, ya que el bloque TRY, FINALLY no realiza su función debidamente.

Ejemplo:

Código Delphi [-]
try
  ShowMessage(IntToStr(StrToInt('a1')));
finally
  ShowMessage('Número no válido');
end;

A pesar de que está en un bloque TRY FINALLY, el programa genera el error y no continua su ejecución, dentro o fuera del entorno de Lazarus.

Solicito de su colaboración para indicarme cómo puedo tratar los errores en el código.

De antemano, gracias por su colaboración.

Casimiro Notevi 25-01-2016 19:06:58

Página 223 en adelante.

roman 25-01-2016 19:19:28

Cita:

Empezado por cd.rafael (Mensaje 501545)
el bloque TRY, FINALLY no realiza su función debidamente.

Para no desalentar el estudio de excepciones que te propone Casimiro Notevi, simplemente diré que el bloque try-finally no maneja excepciones ;)

LineComment Saludos

ecfisa 25-01-2016 19:23:16

Hola cd.rafael.

Hay dos puntos, el primero es que tendrías que usar try/except para capturar la excepción. Ya Casimiro te señaló un enlace donde se trata el tema de forma excelente.

Lo segundo y que corresponde al IDE de Lazarus, es que tendrías que desactivar la opción "Notificar en excepciones de Lazarus", para lo que debes dirigirte en la barra de menu a : Herramientas -> Opciones -> Depurador -> Excepciones del lenguaje

Saludos :)

Edito: Veo que roman ya había apuntado el detalle del uso de finally mientras publicaba este mensaje

cd.rafael 25-01-2016 20:42:35

Efectivamente al cambiar por except funcionó, aunque me acuerdo que en Delphi no tenía esos inconvenientes.

Es posible que los años (sin usar Delphi) no vengan solos. :(

Muchas gracias a todos por su aporte y colaboración.

roman 25-01-2016 21:31:31

En delphi es igual. No son inconvenientes, simplemente es que except y finally tienen dos objetivos distintos.

LineComment Saludos

Delphius 25-01-2016 22:11:27

Cita:

Empezado por cd.rafael (Mensaje 501560)
Efectivamente al cambiar por except funcionó, aunque me acuerdo que en Delphi no tenía esos inconvenientes.

Es posible que los años (sin usar Delphi) no vengan solos. :(

Muchas gracias a todos por su aporte y colaboración.

Pues asi parece. Va a hacer falta repasar algo. Yo también tuve mi "paro" y me costó un poco volver a subirme. La falta de práctica hizo que olvidara algunos principios básicos. Le puede pasar a cualquiera.
Parece que en programación no es como andar en bicicleta. :p

Cita:

Empezado por roman (Mensaje 501561)
En delphi es igual. No son inconvenientes, simplemente es que except y finally tienen dos objetivos distintos.

LineComment Saludos

Bien dicho. Son dos cosas pensadas para cada situación. Aunque también hasta se podría combinarlos.

Lo que quizá haría falta aclarar es que esto de como se maneja la excepciones no es cosa de Delphi o de Lazarus sino más bien ya es cosa de como ha sido pensado y diseñado (y estandarizado convengamos) Object Pascal. ;) que es el realidad el verdadero lenguaje. ¡Cuando no el IDE tratando de ponerse por encima del lenguaje che! :D Mal hacemos en no corregir esto. Que mal acostumbrados estamos.

Saludos,

Ñuño Martínez 26-01-2016 10:29:31

Cita:

Empezado por Delphius (Mensaje 501565)
Bien dicho. Son dos cosas pensadas para cada situación. Aunque también hasta se podría combinarlos. (...)

Precisamente hay una propuesta en estudio en el equipo de FreePascal (y si no recuerdo mal, Embarcadero también la tenía sobre la mesa) para "TRY ... FINALLY ... EXCEPT ... END;" y así no tener que anidar el "TRY ... FINALLY ... END;" dentro de "TRY ... EXCEPT ... END;". Y la verdad, es una de las pocas modificaciones del lenguaje que me parece realmente útil en los últimos años.

Casimiro Notevi 26-01-2016 11:07:14

Cita:

Empezado por Ñuño Martínez (Mensaje 501581)
Precisamente hay una propuesta en estudio en el equipo de FreePascal (y si no recuerdo mal, Embarcadero también la tenía sobre la mesa) para "TRY ... FINALLY ... EXCEPT ... END;" y así no tener que anidar el "TRY ... FINALLY ... END;" dentro de "TRY ... EXCEPT ... END;". Y la verdad, es una de las pocas modificaciones del lenguaje que me parece realmente útil en los últimos años.

Interesante ^\||/

AgustinOrtu 26-01-2016 14:33:21

Sería genial pero me gustaría más try except finally end

El finally maneja el código que se ejecuta siempre, me parece más natural y legible

Además por la forma en que hoy los anidamos el orden es ese

Delphius 26-01-2016 14:42:03

Cita:

Empezado por Ñuño Martínez (Mensaje 501581)
Precisamente hay una propuesta en estudio en el equipo de FreePascal (y si no recuerdo mal, Embarcadero también la tenía sobre la mesa) para "TRY ... FINALLY ... EXCEPT ... END;" y así no tener que anidar el "TRY ... FINALLY ... END;" dentro de "TRY ... EXCEPT ... END;". Y la verdad, es una de las pocas modificaciones del lenguaje que me parece realmente útil en los últimos años.

Yo a esa la apoyo. A mi me rompió la cabeza un poco llegar a acostumbrarme ver esto:

Código Delphi [-]
try
  Obj := TObjecto.Create();
  try
    // Usar objeto
  finally
    // setear variable de estado
    Obj.Free;
  end;
except
   On E: ExceptionConcreta do // y otras excepiones que podría producirse por el objeto ¡o su creación misma!
   begin                                 // y convertirlas a un contexto más superior    
     // hacer algo con esto
    raise ExceptionMasConcretaDetallada.Create(...);
   end;
   // ...                                
end;

Había visto hace días algunas propuestas (más que propuestas son pedidos) en el foro de Lazarus/FreePascal un tanto fuera de norma, como pretender que el for itere de a saltos, o que el swith sea como el que posee Ada. En fin.

Saludos,


La franja horaria es GMT +2. Ahora son las 18:45:33.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi