Fórum Try except (II) #170266

19/07/2003

0

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

Responder

Posts

19/07/2003

Marcelo Carvalho

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


Responder

Gostei + 0

19/07/2003

Paulososi

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;


Responder

Gostei + 0

20/07/2003

Marcelo Carvalho

Oi,

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


Responder

Gostei + 0

20/07/2003

Paulososi

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


Responder

Gostei + 0

21/07/2003

Allan

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


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar