Fórum Try except (II) #170266
19/07/2003
0
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
Curtir tópico
+ 0Posts
19/07/2003
Marcelo Carvalho
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
19/07/2003
Paulososi
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
20/07/2003
Marcelo Carvalho
Esse erro (chave duplicada) não seria pego no evendo OnPostError ?
Gostei + 0
20/07/2003
Paulososi
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
21/07/2003
Allan
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
Clique aqui para fazer login e interagir na Comunidade :)