Mensagem/Aviso dentro de função - Má prática?
Olá pessoal.
Não tenho muita experiência em programação Delphi, e hoje enquanto estava escrevendo um código bateu uma dúvida. É uma má prática chamar mensagens (MessageBox, ShowMessage) e interagir com o usuário dentro de units específicas para funções?
Exemplo.:
Ok. Nesta função eu verifico se ocorreu algum erro para se comunicar ao ECF. Do ponto de vista dos mais experientes, seria mais "correto" passar apenas o retorno e fazer o tratamento na origem da chamada da função?
Enfim, não é um erro por assim dizer, mas estou tentanto melhor minha codificação, e espero que possam ajudar.
Desde já agradeço.
Não tenho muita experiência em programação Delphi, e hoje enquanto estava escrevendo um código bateu uma dúvida. É uma má prática chamar mensagens (MessageBox, ShowMessage) e interagir com o usuário dentro de units específicas para funções?
Exemplo.:
try
Desativar();
if strModelo = 'ecfSweda' then Modelo := ecfSweda;
if strModelo = 'ecfBematech' then Modelo := ecfBematech;
if strModelo = 'ecfDaruma' then Modelo := ecfDaruma;
Porta := strCOM;
Ativar();
except on E: Exception do
begin
if AnsiPos('Communication error 2', E.Message) > 0 then
begin
MsgErro('Não foi possível estabelecer conexão com o ECF. Verifique se o mesmo está devidamente ' +
'conectado e configurado no seu terminal, então tente novamente.');
Result := False;
end;
end;
end;
Ok. Nesta função eu verifico se ocorreu algum erro para se comunicar ao ECF. Do ponto de vista dos mais experientes, seria mais "correto" passar apenas o retorno e fazer o tratamento na origem da chamada da função?
Enfim, não é um erro por assim dizer, mas estou tentanto melhor minha codificação, e espero que possam ajudar.
Desde já agradeço.
Thebluemonkey
Curtidas 0
Melhor post
Marco Salles
13/07/2013
A meu ver o mais correto é gerar exceções personalizadas para cada classe que podem ser recuperadas na origem e ai sim mostrar ou não a mensagem
do que esta ocorrendo
//na implementação
//No Chamador
[]sds
do que esta ocorrendo
ResourceString cMensagemerroporta = 'Não foi possível estabelecer conexão com o ECF. Verifique se o mesmo está devidamente ' + 'conectado e configurado no seu terminal, então tente novamente.'; Type ErroPorta = class Exception;
//na implementação
function TClasseTal.FazCoisa: Boolena;
begin
try
Desativar();
if strModelo = 'ecfSweda' then Modelo := ecfSweda;
if strModelo = 'ecfBematech' then Modelo := ecfBematech;
if strModelo = 'ecfDaruma' then Modelo := ecfDaruma;
Porta := strCOM;
Ativar();
except
on E: Exception do
begin
if AnsiPos('Communication error 2', E.Message) > 0 then
begin
Result := False;
Raise ErroPorta.Create(cMensagemerroporta);
end;
end;
end;
//No Chamador
try Chama a classe except on E:ErroPorta: do apresenta a mensagem com o E.Message ou Personaliza ou faz qq coisa
[]sds
GOSTEI 1
Mais Respostas
Thebluemonkey
12/07/2013
Muito obrigado pelas sugestões Marco Antonio, não tenho experiência com a geração de exceções personalizadas, mas vou dar uma pesquisada sobre o tema para ver se aprendo. Achei dois artigos que parecem ser interessantes, este aqui ([url]http://www.resumoti.com.br/?p=413[/url]) e este outro ([url]http://www.planetadelphi.com.br/artigo/124/tratamento-de-excecoes---parte-1[/url]).
Infelizmente apesar de ter procurado não encontrei nada aqui na DevMedia, imagino que tenha algum material tratando isso, se você souber e puder me indicar eu agradeço.
De qualquer forma obrigado pelas informações.
Infelizmente apesar de ter procurado não encontrei nada aqui na DevMedia, imagino que tenha algum material tratando isso, se você souber e puder me indicar eu agradeço.
De qualquer forma obrigado pelas informações.
GOSTEI 0
Thebluemonkey
12/07/2013
Marco Antonio, enquanto testava as suas sugestões percebi algumas coisas. Em primeiro lugar no meu caso, o que eu desejo primariamente é que caso ocorra o erro de comunicação o sistema pare de executar os comandos subsequentes.
Eu implementei desta maneira:
Como o raise error para a execução do código, acho que vou transformar essa function em um procedure, já que não irei precisar do retorno para saber se devo continuar com a execução do código ou não.
Já que na chamada estou mandando apenas o seguinte:
E desta forma está funcionando da maneira que desejo. O que você acha? Pode ter alguma outra implicação?
Eu implementei desta maneira:
with FormPrincipal.ECF do
begin
try
Desativar();
if strModelo = 'ecfSweda' then Modelo := ecfSweda;
if strModelo = 'ecfBematech' then Modelo := ecfBematech;
if strModelo = 'ecfDaruma' then Modelo := ecfDaruma;
Porta := strCOM;
Ativar();
except on E: Exception do
begin
if AnsiPos('Communication error 2', E.Message) > 0 then
begin
raise EPDVErroPorta.Create(WrapText(cEPDVErroPortaMsg));
Result := False;
end;
end;
end;
end;
Como o raise error para a execução do código, acho que vou transformar essa function em um procedure, já que não irei precisar do retorno para saber se devo continuar com a execução do código ou não.
Já que na chamada estou mandando apenas o seguinte:
begin
ConectarECF();
FrmPDV := TFrmPDV.Create(Self);
FrmPDV.ShowModal;
FreeAndNil(FrmPDV);
end;
E desta forma está funcionando da maneira que desejo. O que você acha? Pode ter alguma outra implicação?
GOSTEI 0
Marco Salles
12/07/2013
Como o raise error para a execução do código, acho que vou transformar essa function em um procedure, já que não irei precisar do retorno para saber se devo continuar com a execução do código ou não.
Certo
Porém acho que vc deve proteger a chamada , para evitar Vazamento de Memória .
begin
ConectarECF();
FrmPDV := TFrmPDV.Create(Self);
FrmPDV.ShowModal;
FreeAndNil(FrmPDV);
end;try
ConectarECF();
FrmPDV := TFrmPDV.Create(Self);
try
FrmPDV.ShowModal;
finally
FreeAndNil(FrmPDV);
end;
except //Faça alguma coisa se quiser ou não faz nada como esta aqui...
end;GOSTEI 0