Mensagem/Aviso dentro de função - Má prática?

Delphi

12/07/2013

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

Thebluemonkey

Curtidas 0

Melhor post

Marco Salles

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


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

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.
GOSTEI 0
Thebluemonkey

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:

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

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
POSTAR