Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Duda no Try..Except (https://www.clubdelphi.com/foros/showthread.php?t=59111)

Paulao 13-08-2008 12:33:44

Duda no Try..Except
 
Señores, tengo un bloco Try..Except, donde yo tengo un codigo para crear un directorio(CreateDir(Path)), pero antes doy un DirectoryExists. Que pasa es, que si fuera posible crear mi Directorio, gustaria que fuera para el bloco Except para yo tratar mi excepccion, pero no esta asi. Si no crea, se va al final, olvidando el Except.

Código Delphi [-]
try
    with Mfd do
    begin
      dirpadrao      := ReadString('MFD','DiretorioPadrao','');
      pathorigem     := ReadString('MFD','PathOrigem','');
      pathdestino    := ReadString('MFD','PathDestino','');
      arquivoorigem  := ReadString('MFD','NomeArquivoOrigem','');
      arquivodestino := ReadString('MFD','NomeArquivoDestino','');
    end;
    if not DirectoryExists(dirpadrao) then
      if not CreateDir(dirpadrao) then
        msg := 'Não foi possível criar o diretório padrão';

    SWEDA_CapturarDispositivo(1,0,'',0,15000);
    SWEDA_ReproduzirFitaDetalhe(PathOrig,PathDest,dtIni,dtFim,0);

    CapeadorReducaoZ;
    CapeadorItens;
    GravaReducao_Z;
    GravaItens;

    if not DeleteFile(dirpadrao) then
      msg := 'Não foi possível deletar arquivos no diretório padrão';

  except
    Warning(msg);
  end;

tcp_ip_es 13-08-2008 12:55:52

Puedes crear cuantos try except quieras, lo que tienes que ver es que excepción te provoca la no existencia de directorio o más bien crearte tu la excepción. ejemplito:

Código Delphi [-]
uses FileCtrl;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not DirectoryExists('c:\temp') then
    if not CreateDir('C:\temp') then
    raise Exception.Create('Cannot create c:\temp');
end;
sacado de la ayuda de Delphi :D

Paulao 13-08-2008 13:21:20

El que yo gustaria es entrar en except siempre que una execpccion fuera encontrada como en mi codigo.

mamcx 13-08-2008 15:14:52

Entonces necesitas es un Try...finally.

Y No "silencies" la excepcion. Siempre es mejor relanzar las excepciones. Es mucho mejor que los errores salgan tan escandalosamente como sea posible porque eso fuerza a hacer los programas mas robustos y ayudan a no tener errores ocultos, como en tu caso: Que garantiza que el error sea por lo que tu piensas? Puede ser un problema de seguridad, o de memoria. O por el frio...

Neftali [Germán.Estévez] 13-08-2008 15:26:14

Juntando lo que te han dicho, yo usaría este:

Código Delphi [-]
msg := '';
try
  try
    with Mfd do
    begin
      dirpadrao      := ReadString('MFD','DiretorioPadrao','');
      pathorigem     := ReadString('MFD','PathOrigem','');
      pathdestino    := ReadString('MFD','PathDestino','');
      arquivoorigem  := ReadString('MFD','NomeArquivoOrigem','');
      arquivodestino := ReadString('MFD','NomeArquivoDestino','');
    end;
    if not DirectoryExists(dirpadrao) then
      if not CreateDir(dirpadrao) then
        msg := 'Não foi possível criar o diretório padrão';

    SWEDA_CapturarDispositivo(1,0,'',0,15000);
    SWEDA_ReproduzirFitaDetalhe(PathOrig,PathDest,dtIni,dtFim,0);

    CapeadorReducaoZ;
    CapeadorItens;
    GravaReducao_Z;
    GravaItens;

    if not DeleteFile(dirpadrao) then
      msg := 'Não foi possível deletar arquivos no diretório padrão';

   finally
     if (msg <> '') then begin
       Warning(msg);
     end;
   end;
except
  on E:Exception be begin
    raise;
  end; 
 end;

Utilizando lo que hay en el finally sólo sacas el mensaje cuando exista error. Además siempre compruebas si lo ha habido; Por ultimo, queda el Except, por si ocurre cualquier otro error inesperado, que tengas constancia de él.

Tal vez, yo lo organizaría de otra forma, pero mantendría esos elementos.

roman 13-08-2008 17:14:16

Cita:

Empezado por Paulao (Mensaje 307350)
El que yo gustaria es entrar en except siempre que una execpccion fuera encontrada como en mi codigo.

Pero el problema aquí es que no hay excepción en tu código, no al menos una provocada por CreateDir. Tal como lo indica tcp_ip_es, CreateDir no genera una excepción en caso de error, simplemente devuelve false. Por ello, y tal como se indica en la ayuda de delphi y ya comenta tcp_ip_es, lo que debes hacer es lanzar tú mismo la excepción.

No entiendo bien por qué te han mencionado lo del finally. No le veo relación al asunto.

// Saludos

mamcx 13-08-2008 19:14:09

Tienes razon roman. Pense era que deseaba que algo siempre se ejcutara, independientemente de si habia o no excepcion.

De todas maneras, la forma de hacer el codigo esta defectuosa. Al enmascarar el error y presuponer la causa se esta dejando un problema latente que luego se podria convertir en un bug dificil de determinar. Existen muchas razones por las cuales un directorio puede o no alterarse.

roman 13-08-2008 19:24:55

Cita:

Empezado por mamcx (Mensaje 307418)
De todas maneras, la forma de hacer el codigo esta defectuosa.

Tienes razón. Tal como lo puso originalmente, intenta captar una excepción que nunca va a ocurrir (la de la función CreateDir) y con ello oculta cualquier otra que sí pueda ocurrir.

A mi en particular no me gusta generar excepciones donde no las hay. Si CreateDir devuelve false, actúo en consecuencia ahí mismo, si necesidad de generar una excepción para tratarla cinco líneas abajo.

// Saludos


La franja horaria es GMT +2. Ahora son las 10:27:45.

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