Ir para conteúdo
Fórum Script Brasil
  • 0

Função Para Erros


Turbo

Pergunta

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

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 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;

Link para o comentário
Compartilhar em outros 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.

Link para o comentário
Compartilhar em outros 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.

Link para o comentário
Compartilhar em outros 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

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...