Try except (II)

Delphi

19/07/2003

Olá,

eu inseri uma chave duplicada para produzir a seguinte mesagem de erro dentro da IDE:

´Project Project1.exe raised exception class EBDEngineError with message ´Key violation. [MYSQL] ... Duplicate entry ´1´ for key ´1´.

Mas o seguinte código para capturar essa exceção não entra no except, para no Query1.ApplyUpdates, ou seja, na mostra o nada que ocorre dentro do except. Por quê???

procedure TForm2.Button1Click(Sender: TObject);
begin
try
Query1.ApplyUpdates;
except
on EDBEngineError do
showmessage(´teste´);
end;
end;

Quero capturar o erro do BDE para poder manipular a mesagem de erro de acordo com as minhas necessidades.

qualquer ajuda é bem vinda. :)

Obrigado,

[]´s
Paulo


Paulososi

Paulososi

Curtidas 0

Respostas

Marcelo Carvalho

Marcelo Carvalho

19/07/2003

Oi,

Tente algo mais genérico:

  try
    //Qualquer coisa que cause erro
  except
    on E:Exception
      do begin
        //Leia o erro em E.message
      end;
  end;


Assim o erro fica encapsulado (não aparece), você pode saber o que ocorreu (mostrar ou gravar em um log), e pode tomar providências...


GOSTEI 0
Paulososi

Paulososi

19/07/2003

Obrigado Marcelo,

mas dessa maneira E.message contém apenas ´Operation aborted´.
Eu preciso que E.message tenha a mensagem de erro do banco
para que eu possa verificar o erro e dar uma mensagem melhor
elaborada. O q vc sugere?


try
Query1.ApplyUpdates;
except on E: Exception do
showmessage(E.message);
end;


GOSTEI 0
Marcelo Carvalho

Marcelo Carvalho

19/07/2003

Oi,

Esse erro (chave duplicada) não seria pego no evendo OnPostError ?


GOSTEI 0
Paulososi

Paulososi

19/07/2003

> Esse erro (chave duplicada) não seria pego no evendo OnPostError ?

Talvez, vou testar.

Mas como eu faço para pegar os outros erros?
Eu quero pegar as mensagens do BDE para eu editá-la em
qualquuer situação ...

Falow ..


GOSTEI 0
Allan

Allan

19/07/2003

paulo,

Como já havia comentado anteriormente , eu uso o evento ReconcileErro do ClientDataSet .

Só faço um ClientDataSet1.ApplyUpdates(0); e trato os erros da seguinte forma :

procedure TForm1.ClientDataSet1ReconcileError(DataSet: TClientDataSet;
E: EReconcileError; UpdateKind: TUpdateKind;
var Action: TReconcileAction);

begin

ShowMessage(E.Message);

if E.ErrorCode = 9729 then
begin
ShowMessage(´Número do Cliente Duplicado !!´);
Abort;
end
else
begin
ShowMessage(´Outro Erro ´);
Abort;
end;

end;

end.

Onde o E.ErrorCode , é o código do erro que é retornado , no caso 9729 é erro de KeyViolation .
Agora pra vc saber o erro que é retornado pra vc emitir as mensagens de acordo com o erro , vc pode editar o arquivo bde.int , em arq.programas\Borland\Delphi\Doc .
Pra exemplo do erro de Key Vilotion , de um localizar (Key Violation) , vc vai achar uma linha com o seguinte código :

ERRCODE_KEYVIOL = 1; { Key violation }

e outra
DBIERR_KEYVIOL = (ERRBASE_INTEGRITY + ERRCODE_KEYVIOL);
Ou seja pra saber o código exato de Key violation , é somar o ERRBASE_INTEGRITY + ERRCODE_KEYVIOL , e procurando o ERRBASE_INTEGRITY , vc vai achar uma linha :

ERRBASE_INTEGRITY = $2600; { Integrity Violation }

Aí somando 2600 + 1 = 2601 esse valor está em Hexa , aí é só converter de Hexa pra Decimal e temos o valor 9729 .

Espero ter ajudado , qq dúvida me passe seu e-mail que te mando uns fontes exemplificando isso .

Allan


GOSTEI 0
POSTAR