Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   consulta try finnaly except (https://www.clubdelphi.com/foros/showthread.php?t=86240)

pani_alex 04-07-2014 16:04:31

consulta try finnaly except
 
me gustaria saber si se puede capturar un exception en el try finally, yo lo estoy usando asi
Código Delphi [-]
try
  try
    codigo
  except
    si el codigo tiene algun error lo grabo en un log
  end;
finally
  finalmente cierro todo
end;

y quisiera algo mas practico como

Código Delphi [-]
try
  codigo
finally
  on e:exception do begin
    grabo excepcion
  end;
  cierrro todo
end;

Casimiro Noteví 04-07-2014 16:36:32

Sí, así :rolleyes:

Neftali [Germán.Estévez] 04-07-2014 17:38:06

¿Porqué quieres capturar la excepción dentro del finally?

El finally te asegura que la ejecución de código pasará por allí, aunque antes se produzcan errores, de esa forma si pones el código de "cerrar todo" (por ejemplo) , te asegurarás de que se ejecuta.

¿Porqué poner el except en una parte del código que se ejecuta siempre, si no quieres que el except se ejecute siempre (sólo cuando hay errores)? No digo que falle, pero no le veo sentido. :confused:

nlsgarcia 04-07-2014 18:21:54

pani_alex,

Cita:

Empezado por pani_alex
...me gustaría saber si se puede capturar un exception en el try finally...

:confused:

Revisa esta información:
Espero sea útil :)

Nelson.

pani_alex 04-07-2014 19:08:28

Cita:

Empezado por Neftali (Mensaje 478705)
¿Porqué quieres capturar la excepción dentro del finally?

El finally te asegura que la ejecución de código pasará por allí, aunque antes se produzcan errores, de esa forma si pones el código de "cerrar todo" (por ejemplo) , te asegurarás de que se ejecuta.

¿Porqué poner el except en una parte del código que se ejecuta siempre, si no quieres que el except se ejecute siempre (sólo cuando hay errores)? No digo que falle, pero no le veo sentido. :confused:

Es que necesito hacer dos cosas a la ves, una grabar si o si un registro de todas las excepciones, por eso el try except y dos asegurarme de que si so si se ejecute el codigo para cerrar/liberar/finalizar x tarea q se haya realizado, no creo que sea la primera persona que haya pensado en eso y me parece que debe existir ya alguna forma para ello, por eso consulto. La parte del on e:exception necesito que se ejecute solo en caso de excepcion no en cada finally
gracias por las respuestas




Cita:

Empezado por nlsgarcia (Mensaje 478706)
pani_alex,


:confused:

Revisa esta información:
Espero sea útil :)

Nelson.

ya lo conocia y lo lei en varias ocaciones, solo que no encuentro lo q busco en esa info

Neftali [Germán.Estévez] 04-07-2014 19:13:55

Cita:

Empezado por pani_alex (Mensaje 478710)
Es que necesito hacer dos cosas a la ves, una grabar si o si un registro de todas las excepciones, por eso el try except y dos asegurarme de que si so si se ejecute el codigo para cerrar/liberar/finalizar x tarea q se haya realizado

En ese caso no se si debería ser algo así:

Código Delphi [-]
try
  try
    codigo
  finally
    cierrro todo
  end;
except
  on e:exception do begin
    grabo excepcion
  end;
end;

nlsgarcia 04-07-2014 19:27:08

pani_alex

El código propuesto en el Msg #6 resume tu requerimiento :rolleyes:

Revisa esta información:



Tomado de : DelphiBasics - Try

Espero sea útil :)

Nelson.

Al González 05-07-2014 00:34:35

Cita:

Empezado por pani_alex (Mensaje 478710)
[...] no creo que sea la primera persona que haya pensado en eso [...]

Es correcto. Existe la recomendación a Embarcadero desde hace algunos años, pero por alguna razón todavía no ha sido implementada. Digo todavía porque confío en que se terminará agregando algún día (así como en su momento se agregó el Exit parametrizado). Las mejoras de sintaxis son el tipo de características que suelen tomarse con mucha calma y meditación antes de agregarlas a un lenguaje de programación maduro. Es una especie de conservadurismo, pero, a semejanza de la Real Academia Española, nos salva (por ahora) de llegar al punto de comunicarnos en spanglish-mandarín. Quizá esta mejora a Try se implemente cuando sea corregido el With.

De momento la solución es anidar un Try dentro de otro Try. ^\||/

Un saludo. :)

nlsgarcia 05-07-2014 01:49:01

Al González,

Cita:

Empezado por Al González
...Existe la recomendación a Embarcadero desde hace algunos años, pero por alguna razón todavía no ha sido implementada...

:confused:

Pregunto:

1- ¿Donde se puede ver esa recomendación a Embarcadero de modificación de la sentencia Try?.

2- ¿Como se implementaría dicha modificación? :rolleyes:

Nelson.

Al González 05-07-2014 07:29:03

Hola Nelson. :)

Cita:

Empezado por nlsgarcia (Mensaje 478732)
1- ¿Donde se puede ver esa recomendación a Embarcadero de modificación de la sentencia Try?.

Al menos aquí: http://qc.embarcadero.com/wc/qcmain.aspx?d=1545

Cita:

Empezado por nlsgarcia (Mensaje 478732)
2- ¿Como se implementaría dicha modificación?

Podría ser como lo pusiste en el mensaje #7, que, dicho sea de paso, es similar a lo que permiten ya otros lenguajes.

Yo creo que es cosa de tiempo y reflexión.

Saludos.

nlsgarcia 05-07-2014 09:22:47

Al González,

Cita:

Empezado por Al González
...Yo creo que es cosa de tiempo y reflexión...

Supongo que Embarcadero no lo ha implementado aun para no salirse del estándar de Object Pascal :rolleyes:

En C# se implementa de la siguiente forma:
Código:

using System;

 namespace ConsoleApplication1
 {
    class Program
    {
        static void Main()
        {
            try
            {
                int N1, N2, N3;
                N1 = 100;
                N2 = 0;
                N3 = (N1 / N2);
                Console.WriteLine("N3 = {0}", N3);
            }
            catch (System.DivideByZeroException e)
            {
              Console.WriteLine("Error : {0}", e.Message);
            }
            catch
            {
              Console.WriteLine("Se Produjo una Excepción No Definida");
            }
            finally
            {
              Console.WriteLine("Fin del Bloque Try");
            }
            Console.ReadKey();
        }
    }
 }

Saludos :)

Nelson.

Casimiro Noteví 05-07-2014 10:05:09

La verdad es que más de una vez he usado los try except dentro de otros try except y entre try finally.
Aunque normalmente no lo recomiendo porque no queda muy claro qué hace exactamente.

pani_alex 09-07-2014 16:08:45

gracias por las respuestas, el try except dentro del try finally me funciona muy bien, solo queria saber si existe alguna mejor forma de hacerlo, el try finally dentro del tray except no me parece q vaya a funcionar pues me parece a mi q al ocurrir la excepcion dentro del try finally el tray except ni se daria por enterado, tampoco lo probe, solo imagine lo q haria segun la informacion que menejo de lo que hacen. Una ves mas gracias

Al González 09-07-2014 19:53:39

Cita:

Empezado por pani_alex (Mensaje 478851)
[...] el try except dentro del try finally me funciona muy bien, solo queria saber si existe alguna mejor forma de hacerlo [...]

Dentro de algunos años, quizá. Hay que seguir granjeando las mejoras. Expresar legítimas inquietudes como la tuya contribuye de buena forma a ese objetivo. :) ^\||/

Un saludo.

mamcx 09-07-2014 23:38:01

Existen otros caminos. Try/Except/Finallys es problemático porque altera el flujo del programa y hace difícil tratar situaciones que se salen del tema de los que es *realmente* excepcional.

El truco es no mezclar Error/Excepción/Opción/Alternativa, que es la causa de mucho lío, ya que muchas cosas que son errores se modelan usando algo hecho para tratar los muy poco habituales excepciones.

La alternativa mas común es usar códigos de error, como en C, pero eso también es problemático, ya que se pierde información.

La manera *elegante* de hacerlo es usando un tipo opcional (https://en.wikipedia.org/wiki/Option_type) que lastimosamente no es viable (osea, delphi no tiene pattern matching ni tipos algebraicos) o usar una función que retorne múltiples valores, que es viable:

Código Delphi [-]
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  Generics.Defaults;

type
  TOptional = record
    E:Exception;
    IsOk:Boolean;
  end;


procedure LogOption(value:TOptional);
begin
  if not value.IsOk then
  begin
    //Aqui logeas...
  end;
end;

function OptionError(fun: TProc): TOptional;
begin
    try
      fun();

      result.IsOk := True;
    except
      on E:Exception do
      begin
        result.E := E;
      end;
    end;
end;

var
  result: TOptional;


begin
  LogOption(OptionError(
        procedure
        begin
          Writeln('Hello World');
        end
    ));
end.

//P.D: No encontré como hacer una versión genérica usando TFunc en vez de un TProc. Se puede implementando como una clase pero ya no queda tan limpio de usar.

Nota que la idea es encapsular el manejo de las excepciones y usar procedimientos anónimos para quedar con una interface limpia a la vez que se retiene el error/excepción y se usa como se quiere, sin perder la linea de visión.

Esto combina ambos beneficios del método de manejo de errores con "Códigos de retorno" y "Excepciones".

Es una lastima que no veo como hacerlo aun mas limpio, y que en Delphi, a si como en la mayoría de los lenguages que usan excepciones, - con la excepción -!- de objective-c que tiene separado Error de Excepcion- ambas cosas están mezcladas y no hay una forma simple de desgranar las dos cosas. Se puede hacer un API que en vez de Exeption devuelve un Objeto Error, pero eso no es natural en Delphi, asi que creo que esto es lo máximo que se puede sin meter cosas alienigenas.

P.D:

Esto se parece al método que se usa en GO:

http://stackoverflow.com/questions/1...ing-techniques

Aunque en GO se pierde las ventajas de las excepciones. No hay muchos lenguajes donde se pueda diferenciar entre ambas cosas y que ademas no mezclen el asunto de liberar recursos.

D es uno de ellos, maso:

http://dlang.org/exception-safe.html

Ah!, me acorde que Elixir tiene el estilo que busco:

http://elixir-lang.org/getting_started/17.html

Da resultado estar averiguando como hacer un lenguaje de programacion ;)


La franja horaria es GMT +2. Ahora son las 06:56:09.

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