segunda-feira, 17 de janeiro de 2011

Sugestão para tratamento de erros no Delphi / Cliente-Servidor

Todas as vezes que são abertas as tabelas é colocado o comando StartTransaction antes da abertura das mesmas.
Quando acontece algum erro na abertura das tabelas, o Delphi dispara uma mensagem de erro. Este erro pode ter sido provocado por diversos motivos mas é certo que o erro foi de alteração de uma ou mais tabelas no Banco de Dados. é aconselhável que se coloque uma rotina de tratamento de erro listada abaixo: 
- Onde estão as tabelas, coloque as suas tabelas que serão abertas; 
- Onde será mostrada a mensagem coloque uma mensagem qualquer avisando sobre o erro 
try
   if F_Menu.DBSistema.IsSQLBased then 
      F_Menu.DBSistema.StartTransaction;
   Tabela1.Open;
   Tabela2.Open;
   Tabela3.Open;
   Tabela4.Open;
except
   on EDatabaseError do
     if MessageDlg(, mtError, [mbOK], 0) <> mrOK Then
       raise;
     end;
ShowModal;  
Sugestão  Delphi / Oracle  
      Criar uma função que irá verificar qual o código de erro enviado pela exceção e então emitir uma mensagem em português. Abaixo está uma idéia desta rotina que será inserida no formulário principal da sua aplicação.  
procedure TF_Menu.ErrorMsg(Sender : TObject; E: exception);
begin
if e is EDBengineError then
      TrataErro(E as edbEngineError)
else
    application.showException(E);
end;  
procedure TF_Menu.TrataErro(E: eDBEngineError);
var
nSQLError   : integer;
cSQLMessage : string;
cTable      : string;
x           : integer;
begin
    nSQLError := 0;
    cSQLMessage := '';
    for x:=0 to e.ErrorCount -1 do
       if e.errors[x].NativeError <> 0 then
       begin
          nSQLError   := e.errors[x].NativeError;
          cSQLMessage := e.errors[x].message;
       end;
       if nSQLError <> 0 then
       begin
          cTable := '';
          x      := pos('table"',cSQLMessage);
          if x > 0 then
          begin
             cTable := copy(cSQLMessage,x+7,20);
             x      := pos('"',cTable);
             if x > 0 then cTable := copy(cTable,1,x-1);
          end;
       case nSQLError of
               1  : showmessage('Este registro já está cadastrado.');
          2292 : showmessage('Este resgistro não pode ser excluído porque'+#10+
                     'existem outros que dependem dele e que não foram excluídos');
        12203 : showmessage('Base de Dados está fora do ar. Favor entrar'+#10+
                     'em contato com o responsável pela rede na '+#10+
                     'localidade selecionada ou tente mais tarde.');
       else
          showmessage(IntToStr(nSQLError)+' '+cSQLMessage);
       end;
    end
else
    showmessage('Algo errado aconteceu!');
end;
 
procedure TF_Menu.FormCreate(Sender: TObject);
begin
  Application.OnException := ErrorMsg;
end;

Nenhum comentário:

Postar um comentário