Try e Finally no DELPHI

Delphi

22/10/2012

Olá pessoal alguém poderia explicar,

com qual finalidade eu,

uso o Try / Finally
Gustavo Fernandes

Gustavo Fernandes

Curtidas 0

Melhor post

Tiago

Tiago

22/10/2012

Boa tarde, o try é um bloco de comandos que você quer que determinadas operações sejam feitas. Já o finaly é um bloco de comandos que você utiliza para terminar determinado procedimento. Um exemplo cálculo de média:

try{
nota1=5
nota2=5

media=(5+5)/2
}
finaly{

imprimir("A média é :" +media)
}


Espero ter ajudado
GOSTEI 1

Mais Respostas

Alessandro Yamasaki

Alessandro Yamasaki

22/10/2012

Tratamento de exceções
GOSTEI 0
Jurandi Frade

Jurandi Frade

22/10/2012

Tratamento de exceções é através de
Try
Except
On E: except // caso vc queira saber a exceção
End;

E

Try
Finally
End;

vc usa quando quer que uma determinada ação sempre ocorra ao final de um procedimento.
Ex:
Try
TextoHeader := TRichEdit.Create(Self);
....
....
Finally
Textheader.free;
End;

Espero ter ajudado.
Sds,

GOSTEI 0
Alisson Santos

Alisson Santos

22/10/2012

Esse tipo de tratamento você pode estar fazendo sempre que achar que aquele código que está desenvolvendo pode dar algum erro, independente do erro que ocorrer ele vai executar o finally.
GOSTEI 0
Gustavo Fernandes

Gustavo Fernandes

22/10/2012

Agradeço pela atenção galera.

Só mais uma pergunta eu, estou montando

meu, bloco da seguinte maneira abaixo.

Application.CreatForm(TF_Form1, F_Form1)
try
F_Form1.ShowModal;
F_Form1.Realese;
finally
FreeAndNil(F_Form1)
end;

Neste Bloco tem como utilizar o Except junto com finally ?

pois quando tento da erro, logicamente acabo optando um deles.
GOSTEI 0
Claudia Nogueira

Claudia Nogueira

22/10/2012

Está estranho você usar um Release depois do ShowModal, isso não é necessário.
Quando tem algum retorno depois do ShowModal, quer dizer que a tela já foi fechada.
Pra criar/abri um form eu simplesmente faço dessa maneira:
  Application.CreateForm(TF_Form1, F_Form1);
  F_Form1.ShowModal;
  FreeandNil(F_Form1);


Se você deixa seus Forms criando automaticamente no projeto (não é aconselhado), aí ficaria somente assim:

  F_Form1.ShowModal;


Em todo caso, respondendo sua dúvida, se é possível usar o except com o finally, sim é possível, veja o exemplo:
try
  F_Form1.ShowModal;
  F_Form1.Realese;
finally
  try
    FreeAndNil(F_Form1)
  except
  end;
end;


Agradeço pela atenção galera.

Só mais uma pergunta eu, estou montando

meu, bloco da seguinte maneira abaixo.

Application.CreatForm(TF_Form1, F_Form1)
try
F_Form1.ShowModal;
F_Form1.Realese;
finally
FreeAndNil(F_Form1)
end;

Neste Bloco tem como utilizar o Except junto com finally ?

pois quando tento da erro, logicamente acabo optando um deles.
GOSTEI 0
Marco Salles

Marco Salles

22/10/2012

Hummm , a dúvida dele não é se pode usar mas qual usar e qual a diferença entre os blocos

primeiro lugar sua estrututa de instanciação não é recomendada e ja tive relatos de inumeros erros com ela


Application.CreatForm(TF_Form1, F_Form1)
try
F_Form1.ShowModal;
F_Form1.Realese;
finally
FreeAndNil(F_Form1)
end;


Veja o Link , onde aparentemente nada de anormal ao utilizar o Application.createForm

http://forum.devmedia.com.br/viewtopic.php?t=79822&highlight=application+createform

Nesta estrutura o Proprietário do Form é do Objeto application .. È dele a responsabilidade de desalocar a memória de
destruir a instancia do form ... Ma logo abaixo vc da um FreeAndNil(F_Form1) o que é incoerente com o próposito . Logo
descarte a utilização desta estrutura (no meu ponto de vista)

2)Segundo lugar como a amiga Claudiadnh relatou


Está estranho você usar um Release depois do ShowModal, isso não é necessário.
Quando tem algum retorno depois do ShowModal, quer dizer que a tela já foi fechada.
Pra criar/abri um form eu simplesmente faço dessa maneira:


Não so é estranho como não se aplica utilizar o release neste arquitetura . As bigrafias do delphi comentam sobre o release mas ela geralmente é utilizado dentro do próprio form e não fora dele ... Aqui vc esta instanciando um form a partir da uses (do form Principal) e portanto o release não se aplica ... O freeandnil ou em alguns casos (depende do escopo da variável Form) o simples free resolve

3)Agora sua dúvida quanto o try excpet ou try finally é simples .... o try finaly sempre indepedemente de ocorre ou não
uma exceção o Finally sera sempre executado e o excpet depende de ocorrer a exceção

então vejamos



F_Form1:=TF_Form1.create(nil);
try
F_Form1.ShowModal;

//supor outras instruções passiveis de erros como valiaçoes , formatações enfim -->> Aqui cabe um try excpet
try
//codigo que deve ser tratado caso aja uma exceção
excpet
//blablablabla
end;

finally //Vc deve utilizar o Finally pq vc quer indepemente de ocorrer ou não a exceção liberar a memória 
FreeAndNil(F_Form1); //ou F_Form1.free  para variáveis locais conforme comentado acima
end;
end;


O último detalhe que pode paraecer despercebido (utilizo como critétio pessoal para conhecer o nivel do programador)
é se o try esta antes ou depois do F_Form1:=TF_Form1.create(nil);

Vejo em algumas revistas em alguns códigos de artigos conceituados a má aplicação desta ordem . De cara fico com receio de
continuar a leitura , pois é um básico que não pode ser deixado de mão em quem quer forma opinição . Logo o Try fica após
o F_Form1:=TF_Form1.create(nil); porque subtende-se que caso ocorra algum erro interno ou fora do nosso controle o próprio
delphi desaloca a memória e a instrução Finally não é executada


F_Form1:=TF_Form1.create(nil); // Por alguma razão deu erro aqui -->>> O Próprio delphi se vira para desalocar memória
try  // blocos abaixo devido ao erro não é executado
//
finally
.....



desculpe o testamento , mas se vc ler com atenção dificilmente vc terá problemas com isto [[sds e um abraço amigo
GOSTEI 0
Gustavo Fernandes

Gustavo Fernandes

22/10/2012

Desde já,

gostaria agradecer a Claudia e Marco Antonio e entre outros.

Pela atenção dada em relação a minha dúvida, muito obrigado.


GOSTEI 0
POSTAR