Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

lucascolferai

Lista de Exceções para tratamento de erros

Recommended Posts

Oi gente, beleza?

 

Alguém tem uma lista das exceções do Delphi? Tô tentando localizar na net, mas tá difícil.

 

No caso, tô procurando especialmente duas exceções: violação de foreing key e perda de conexão com o servidor de banco de dados.

 

Alguém pode me ajudar?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acredito que não tenha uma lista, pois pode existir exceção para praticamente qualquer coisa, qualquer errinho por menor que seja pode gerar um exceção, na empresa o que fizemos foi monitorar as exceções, na medida que foram aparecendo foram tratadas, sempre que aparece uma nova tem seu tratamento...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois eh Marcio, depois que eu fui perceber que a própria mensagem de erro do Delphi mostra o nome da exceção.

 

Mas agora eu tô com outro dilema... O Delphi apresenta a mesma exceção para dois erros diferentes:

 

- violação de foreing key

- perda de conexão com o servidor de banco de dados

 

Para ambos o Delphi gera a exceção EIBInterBaseError, mas com mensagens diferentes... Você sabe como tratar isso?

 

Como vocês fazem para tratar a violação de chave estrangeira?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sempre pego duas informações do erro, a mensagem e a class, no caso a classe vai vir como EIBInterBaseError e a mensagem vai vir como violação da chave estrangeira, sendo que ao trabalhar e exibir a mensagem pego a classe para catalogar, no caso seria exceção do banco de dados, e depois a mensagem... A classe sempre virá como EIBInterBaseError, quando se tratar de exceções do BD.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Marcio,Bem pensado! Vou fazer isso mesmo. Só não tô conseguindo pegar a mensagem de erro. Eu consegui achar a propriedade certa, mas acho q minha estrutura tá errada. Tem como você postar um exemplo aí, de como você faz?Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Marcio,

 

Consegui... hehehehe... Era um errinho bobo.

 

Para quem tiver a mesma dificuldade no futuro, segue abaixo o código pronto, com uma breve explicação. Este procedimento eu uso para excluir um registro da tabela, com uma transação e registro de log (função CriarLogErro).

 

procedure TfrmModulos.btnExcluirClick(Sender: TObject);var  login, aux: string;  erro: EConvertError;begin  if messagedlg ('ATENÇÃO! Você está prestes a excluir o módulo '+ uppercase(dm.ibtModulosMODLOGIN.AsString)+				 '. Deseja prosseguir?', mtWarning, [mbYes, mbNo], 0) = mrYes then  begin	// Guarda o login do módulo para depois usar no log	login := dm.ibtModulosMODLOGIN.AsString;	try	  if not dm.itrTransa.InTransaction then		dm.itrTransa.StartTransaction;	  dm.ibtModulos.delete;	  dedLogin.setfocus;	  // LOG	  insereLog ('Exclusão do módulo '+login);	  dm.itrTransa.CommitRetaining;	except	  on erro : EIBInterBaseError do	  begin											   		// Violação de Chave Estrangeira		aux := copy(erro.Message,0,24);		if (aux = 'violation of FOREIGN KEY') then		begin		  MessageDlg('Não é possível excluir o módulo '+login+					 ' pois ele está ligado a outras informações do Banco de Dados.',mtWarning,[mbOK],0);		end;		// Perda de conexão com Banco de Dados		aux := copy(erro.Message,0,27);		if (aux = 'connection lost to database') then		begin		  MessageDlg('Não foi possível excluir o módulo '+login+'.'+#13+					 'O sistema perdeu a conexão com o Banco de Dados.'+#13+					 'Por favor, tente excluir novamente ou, em último caso, reiniciar o programa.',mtWarning,[mbOK],0);		  CriarLogErro(datadosistema, horadosistema, 'Sistema perdeu conexão com o banco de dados');		end;	  end	  else	  begin		MessageDlg('ATENÇÃO!!! Ocorreu um erro na operação.'+#13+				   'Comunique imediatamente o suporte técnico.'+#13#13+				   'Será gravado um arquivo de log contendo maiores informações.',mtError,[mbOK],0);		CriarLogErro(datadosistema, horadosistema, 'Tentou excluir o módulo '+login);	  end;	end;  end;end;
Percebam que na cláusula EXCEPT da estrutura TRY, a captura/identificação do erro ocorre no trecho "on erro : EIBInterBaseError do". A partir desse momento, a variável "erro" recebe as informações correspondentes à exceção, caso o tipo seja "EIBInterBaseError".

 

Podemos colocar mais capturas/identificações em nosso EXCEPT. Basta (óbviamente) acrescentar um ";" após o "end" que precede o "else" e também um novo trecho "on erro : <<tipo_do_erro>> do", seguindo o modelo do código mostrado acima.

 

E para finalizar, percebam que dentro do trecho citado acima, faço comparações com as mensagens mostradas, usando a propriedade "Message" da variável de captura.

 

 

 

Consegui perceber a grande diversidade de exceções que podem existir, por isso estou modificando o código acima para um modelo de mais fácil manutenção. Vou usar um procedimento genérico (que será reusado em todos os outros forms) que busque de um cadastro (tabela), as mensagens de exceções do sistema. Assim posso modificar facilmente os dados de cada uma delas. O quê você acha disso Marcio?

 

Abraço a todos. Obrigado pela ajuda Marcio.

 

B)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Perfeito, ficou legal como você fez, se quiser, pode mudar um pouco e tornar mais dinâmico o com menos serviços, para isto coloque o componente TApplicationEvents da paleta Additional e no evento OnException pode fazer o controle de exceção, sendo que precisaria fazer somente uma vez para todo o programa, não precisando repetir em todos os locais...

Se acessar o evento, verá que é recebido um E: Exception, no qual se pode trabalhar com ele, pegando E.Message, que seria a mensagem de erro, e E.ClassName que é a classe de erro, assim poderia montar uma unit somente para tradução de erros, que se aplicaria a todo o seu aplicativo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Marcio,Interessantíssima a sua solução. Só pra confirmar alguns pontos:- O componente deve ser colocado no form principal da aplicação, correto?- E o TRY, como fica? Ele não é mais necessário? Ou mantenho ele? Tô na dúvida nessa...Fiquei pensando quando você falou na Unit... Qual a melhor solução na sua opinião, Unit ou Cadastro de Mensagens? Pensando aqui no caso da Unit, para acrescentar novas mensagens de exceção, eu precisaria recompilar o programa e reinstala-lo em todas as máquinas novamente, né? Já no caso do Cadastro, seria só acessar o programa, cadastrar a nova exceção e tá valendo.Eaí?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso, deve de ficar no form principal.Não é necessário try except, caso ocorra, vai cair nesta exceção "global", mas caso coloque um try except em um local do fonte, será este a ser executado...Bom, particularmente uso com DLL, ou seja, criei a DLL com as exceções, caso tenha uma nova, preciso somente mandar a DLL, pode usar também BPL, ou então cadastro mesmo como mencionou, seria somente mais um item em tabela, ficaria mais prático o fonte...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Marcio,

 

Legal, obrigado pelas explicações. Vou optar pelo cadastro mesmo; mas a sua idéia da DLL também é ótima. Sei que isso faz pesar um pouco mais o banco (consultas, operações, etc), mas nesse projeto isso não vai ser um problema tão relevante.

 

Muito obrigado pela atenção nas respostas. Grande abraço.

 

http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

olá pessoal!! Desculpem ressuscitar este tópico, mas achei melhor que criar um novo pois minha dúvida pertinente a este assunto.

 

Bom meu caso é o seguinte: fiz tudo o que os amigos aí em cima fizeram, porém não estou conseguindo capturar uma exceção gerada pelo delphi no momento em que eu tento inserir um registro com a chave primária repetida.

 

Eu estou usando para conexão o "TSQLConnection", como tabela o TSimpleDataSet e o componente TDataSource.

 

Usei o seguinte código:

 

if (DM.TProcedimento.State in [dsInsert,dsEdit])  then
  begin
	try
	  DM.TProcedimento.Post;
	  DM.TProcedimento.ApplyUpdates(0);
	except 
	  on E: EDatabaseError do
		ShowMessage(E.Message);	  
	end;
 end;

Testei da seguinte forma:

 

1 - Inseri pelo IBExpert um procedimento com o ID = 1;

2 - Dentro do Delphi, no formulário, tentei inserir um registro com o mesmo ID (1);

3 - Dentro do Delphi, o debugador acusa um erro, da classe EDatabaseError, com a mensagem: "violation of PRIMARY..."

porém esta exceção não é capturada pela cláusula except, e passa despercebida. Quando executo o programa

"fora" do delphi, ele não retorna nehum erro, mesmo que eu retire o try[...]except;

 

Alguém aí já viu isso??

 

Valeu galera!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.