Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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
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:
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?
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.
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
Seguinte, coloca como hoje esta fazendo para interceptar as mensagens de erro, dependendo podemos apenas melhorar a sua função, senão dou umas dicas de como eu faço...
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)
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...
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í?
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...
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
beleza... http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif
Precisando, posta aqui... :D
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; 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!!
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...