PDA

Ver la Versión Completa : Duda no Try..Except


Paulao
13-08-2008, 12:33:44
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.

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:


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:


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
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
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