segunda-feira, 3 de maio de 2010

Tratando Erros/Exceções de forma global no Delphi 7 com o "Application.OnException"

Sei que o assunto pra muitos vai parecer velharia, e até é mesmo, mas, como estou firulando esses dias com o Delphi, resolvi compartilhar esse detalhezinho que precisei para tratar exceções de forma global.


Sei que existem diversas dicas na net de como fazer isso, mas, nesse caso especial, vi que muitas pessoas estavam se enrolando ao tentar tratar Exceções do BDE como uma Exceção comum, então fica a dica:

1) Crie uma procedure no seu formulário principal

>> procedure ManipulaExcecoes(Sender: TObject; E: Exception);


2) Implemente a procedure conforme abaixo

>> procedure TFormPrincipal.ManipulaExcecoes(Sender: TObject; E: Exception);
Begin
TRATA_ERRO(E as EDBEngineError);
end;


3) No evento OnCreate do form principal escreva o seguinte código

>>procedure TFormPrincial.FormCreate(Sender: TObject);
begin
Application.OnException := ManipulaExcecoes;
end;


4) Por último implemente a função que trata os erros

>>Procedure TRATA_ERRO(vErro : EDBEngineError);
Var
x : Integer;
Begin
For x := 0 To vErro.ErrorCount -1 Do
Begin
If vErro.Errors[x].NativeError=0 Then
Case vErro.Errors[x].ErrorCode Of
9475:ShowMessage('Espaço Insuficiente em Disco.');
9479:ShowMessage('Tabela Está Cheia');
9429:ShowMessage('Espaço Insuficiente em Disco.');
9432:ShowMessage('Campo Obrigatório Sem Valor.');
9744:ShowMessage('Este registro não pode ser removido, outros registros dependem dele.');
9733:ShowMessage('Campo preenchido com valor incorreto! Verfique os dados informados!'+#13+vErro.Errors[x].Message);
9734:ShowMessage('Este registro não pode ser removido, outros registros dependem dele.'+#13+#13+'Para excluí-lo você deve primeiro excluir os seus dependentes...');
10241:ShowMessage('Registro em Uso Por Outro Usuário.');
10019:ShowMessage('Valor informado fora da limite permitido!')
Else
ShowMessage('Comunique o Erro Abaixo ao seu programador ou responsável pelo sistema.'+#13+IntToStr(vErro.Errors[x].ErrorCode)+'-'+vErro.Errors[x].Message);

End;
End;
End;



Pronto, agora é só usar!

[]'s