Você está na página 1de 3

Cdigo //Obs: As procedures serao criadas no public do form principal { 1) No evento OnCreate do form principal coloque a rotina que

ira disparar outra procedure sempre que ocorrer qualquer tipo de erro na aplicacao.} procedure TF_Menu.FormCreate(Sender: TObject); begin Application.OnException := ErrorMsg; end; { 2) Crie outra procedure no form principal que ira filtrar o tipo de erro para depois trata-lo. Por enquanto eu so estou tratando os do tipo EDBEngineError. } if e is EDBengineError then TrataErro(E as EDBengineError) { if e is EMathError then Showmessage(E.message); if e is EFCreateError then Showmessage(E.message); if e is EFilerError then Showmessage(E.message); if e is EFOpenError then Showmessage(E.message); if e is EInOutError then Showmessage(E.message); if e is EIntError then Showmessage(E.message); if e is EListError then Showmessage(E.message); if e is EMenuError then Showmessage(E.message); if e is EComponentError then Showmessage(E.message); if e is EWriteError then Showmessage(E.message); if e is EStreamError then Showmessage(E.message); if e is EStringListError then Showmessage(E.message); if e is EConvertError then Showmessage(E.message); if e is EParserError then Showmessage(E.message); if e is ERangeError then Showmessage(E.message); if e is EReadError then Showmessage(E.message); if e is EReportError then Showmessage(E.message); if e is EStreamError then Showmessage(E.message);} else application.showException(E); end;

{ 3) Crie a seguinte procedure no form Principal que ira tratar o erro (traduzi-lo). No meu caso, eu utilizo Delphi/Oracle e os erros DBEngineError disparados pelo Oracle possuem codigos que sao os descritos dentro desta rotina. Creio que cada banco de dados deva ter seus proprios codigos. } 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('tabela',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; messagebeep(0); case nSQLError of 1 : showmessage('Este registro j est cadastrado.'); 2292 : showmessage('Este resgistro no pode ser excludo porque'+#10+ 'existem outros que dependem dele e que no foram excludos'); 12203 : begin showmessage('Base de Dados est fora do ar. Favor entrar'+#10+ 'em contato com o responsvel pela rede na '+#10+ 'localidade selecionada ou tente mais tarde.'); Application.Terminate; end; 2067 : showmessage('Ocorreu um erro no Banco de dados. Favor'+#10+ 'entre em contato com o responsvel pelo sistema '+#10+ 'e informe o cdigo "ORA-2067 Rollback requerido."'); 2049 : showmessage('Tempo de resposta excedido. Anote este erro '+#10+ 'e contacte o responsvel pelo sistema. Erro: ORA-2049. '); 2063 : begin showmessage('Erro com a base de dados da localidade. Comunique o responsvel'+#10+ 'pelo sistema e informe o erro:

ORA-2063. '); Application.Terminate; end; 1017 : begin showmessage('Usurio e/ou Senha incorretos. Informe novamente. Comunique o responsvel'+#10+ 'pelo sistema e informe o erro: ORA-1017. '); Application.Terminate; end; 942 : showmessage('Erro ao tentar acessar uma tabela no autorizada'+#10+ 'para o usurio.'); 904 : showmessage('Houve erro no processamento. Existe um nome de coluna'+#10+ 'invlida para a tabela on consulta referenciada neste mdulo.'); 12154: begin showmessage('Nome do Servidor de Banco de Dados est incorreto ou no existe.'); Application.Terminate; end; 6550 : showmessage('A rotina que executa este processamento no est criada no Banco de Dados.'+#10+ 'Informe ao responsvel os cdigos: ORA-06550 e PLS-00201.'); else showmessage('Anote esta mensagem: '+cSQLMessage); end; end else showmessage('Erro desconhecido. Comunique o responsvel pelo Sistema'); end;