• 0
Sign in to follow this  
Turbo

Função Para Erros

Question

fala galera, o problema é : quero fazer uma função que trate os erros mais comuns de banco de dados.

porque estou tratando todos de uma unica forma, como exception, e dando uma mensagem generica....

como faço para criar uma função que trate os erros de BD, tipo Access Violation, Violation Key....

espero ajuda c possivel....

vlw....

Share this post


Link to post
Share on other sites

8 answers to this question

Recommended Posts

  • 0

Inclua a unit DBITYPES na clausula uses do seu form.

procedure TForm1.Table1PostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction);

begin

if EDBEngineError(E).Errors[0].ErrorCode = 9729 then

ShowMessage('Registro já existe!');

Action:= daAbort;

end;

Share this post


Link to post
Share on other sites
  • 0

Bem, deve-se manipular exceções com o o objetivo de tratar erros de execução e proteger recursos.

Os comandos geralmente utilizados são TRY...EXCEPT e TRY...FINALLY. O TRY...EXCEPT você já está usando. o TRY...FINALLY funciona da seguinte maneira: todas as instruções devem ser colocadas dentro do bloco TRY e a instrução ou, as instruções que, em hipótese alguma, podem deixar de ser executadas, devem ser colocadas no bloco FINALLY. Em outros termos, não importa o que aconteça no bloco TRY, as instruções dentro do FINALLY sempre serão executadas.

Sintaxe:

==============

Try

<instrução>;

Finally

<instrução>;

end;

==============

Bem, estes comentários iniciais certamente já são de seu conhecimento.

As exceções que são geradas através de banco de dados são tratadas de forma um pouco distinta das exceções "normais". A principal diferença está na utilização da classe 'EDatabaseError', que é a classe mais alta das exceções de banco de dados do Delphi, ou seja, todas as exceções de banco de dados do Delphi são derivadas desta classe. Logo, teremos outras classes abaixo de EDatabaseError.

Veja um exemplo:

===================================

Try

Table1.Post;

Except

On EDatabaseError do

ShowMessage('Não foi possível gravar o registro!');

Raise;

end;

===================================

Obs.: A palavra reservada RAISE, utilizada no exemplo acima, de um modo geral, possui duas utilidades: 1) pode ser usada para gerar novamente uma exceção que já tenha sido manipulada, visto que, uma vez tratada, a exceção é destruída; 2) utilizada para gerar manualmente uma exceção, simulando uma condição de erro (v.g., "RAISE Exception.Create ('Mensagem para o usuário!');").

Voltando ao assunto, o grande problema de seu utilizar a classe de exceção 'EDatabaseError' é que ela não especifica que tipo de exceção ocorreu, somente retorna um erro genérico qualquer. Para contornar este problema, podemos utilizar a classe EDBEngineError para obter mais informações específicadas da exceção. A classe 'EDBEngineError' é descendente direto de 'EDatabaseError', mas possui algumas propriedades adicionais úteis para um tratamento mais refinado de exceções. Dentre elas, destaca-se o array ERRORS, o qual possui uma série de propriedades, dentre as quais:

Algumas propriedades do ARRAY ERRORS:

============================

- ErrorCode: retorna o código do erro, quando for um erro de BDE (por isto que eu queria saber se vc. usava o não BDE);

- Category: retorna a categoria do erro referenciada em ErrorCode;

- SubCode: retorna o sub-código do erro. Especifica mais informações sobre o erro ocorrido;

- NativeError: utilizado somente quando se está conectado a um servidor de banco de dados. Se o retorno do NativeError for igual a zero, então não é erro do servidor, caso contrário, o código do erro é retornado;

- Message: Estando conectado a um servidor SQL, você retornará a mensagem do servidor, caso contrário, retornará a mensage do BDE.

Exemplo:

=============================================================

procedure TForm1.Button1Click(Sender: TObject);

begin

try

table1.post;

ShowMessage('Registro gravado com sucesso.');

table1.Refresh;

except

on E:EDBEngineError do

begin

if E.Errors[0].ErrorCode=9729 then

Raise Exception.Create ('Violação da chave primária')

else

begin

ShowMessage('Erro geral de gravação.' + E.Message);

Table1.Cancel;

end;

end;

end;

end;

=============================================================

A variável 'E' no código acima recebe todas as informações da exceção gerada, para posteriormente ser utilizada em nosso formulário de saída de mensagens.

Por fim, vale a pena observar que existem alguns eventos dos componentes 'TDataSet' que são bastante interessantes e apropriados para manipulaçao de exceções, tais como, 'OnPostError', 'OnEditError' e 'OnDeleteError'. Um exemplo já foi dado pelo nosso colega ALESSANDRO acima.

Espero ter mostrado uma "luz" para você.

Abraços.

Share this post


Link to post
Share on other sites
  • 0

cara vlw, mas o que tou querendo é o seguinte:

* eu to acessando as tabelas através de sql

* estou usando o try

* tenho uma variavel do tipo E que recebe todo e qualquer tipo de exception

* eu quero criar uma função que passando essa variavel E, consiga manipular todos os erros de um banco de dados, e colocar essa função em uma dll.

Share this post


Link to post
Share on other sites
  • 0

cara vlw, mas o que tou querendo é o seguinte:

* eu to acessando as tabelas através de sql

* estou usando o try

* tenho uma variavel do tipo E que recebe todo e qualquer tipo de exception

* eu quero criar uma função que passando essa variavel E, consiga manipular todos os erros de um banco de dados, e colocar essa função em uma dll.

Não há diferença em você acessar através de SQL. O exemplo que eu dei também utiliza o TRY, bem como a variável 'E'. Veja, esta variável 'E' recebe todas as informações da exceção gerada. A exceção carrega consigo uma série de informações pertinentes a ela, e estas informações estão sendo adicionadas à variável.

Eu fiz um EXEMPLO com uma função chamada 'TrataErros'. Dê uma olhada e veja se ajuda em alguma coisa.

Download: http://www.cordeirorodrigues.com.br/capabl.../forum/r_08.zip

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this