Retornar erros do sistema em message
12/03/2006
0
Pessoal preciso de um código que retorno que o erro do sistema em um message definido pelo programador..
Att,
Wagner
Wagnermarrane
Posts
12/03/2006
Aroldo Zanela
Você pode esclarecer um pouco mais? Você se refere a tratamento de exceções personalizadas? Pode citar um exemplo?
13/03/2006
Adriano Santos
Bom, se for o que estou pensando refere-se ao desvio das exceções para um procedimento personalizado. Isso você fazer apenas redicionando o onException do TApplication para uma procedure que você desenvolva, por exemplo:
procedure MostraErro(Sender: TObject; E: Exception); begin ShowMessage(E.Message); end;
Daí em algum momento vc desvia evento onException do TApplication para sua procedure:
Application.OnException := MostraErro;
13/03/2006
Paullsoftware
na paleta Additional (Delphi7) tem o componente [b:83aa860267][i:83aa860267]´ApplicationEvents´[/i:83aa860267][/b:83aa860267] eu uso ele em uma aplicação minha por enquanto é para testes mais estou adorando, coloque ele no seu formulário principal e faça o seguinte evetno OnException do componente faça:
procedure TfMenu.ApplicationEventsException(Sender: TObject; E: Exception); var NomeDoLog: string; Arquivo: TextFile; begin NomeDoLog := ChangeFileExt(Application.Exename, ´.log´); AssignFile(Arquivo, NomeDoLog); if FileExists(NomeDoLog) then Append(arquivo) else ReWrite(arquivo); try WriteLn(arquivo, ´****************** ´+DateTimeToStr(Now)+ ´ ****************** ´); Writeln(arquivo, ´Erro Ocorrido: ´); Writeln(arquivo,E.Message); Writeln(arquivo, ´Janela: ´+ Screen.ActiveForm.Name + ´ Controle Ativo: ´+Screen.ActiveControl.Name); WriteLn(arquivo, ´----------------------------------------------------------------------´); MessageDlg(´Ocorreu o seguinte erro:´+e.Message,mtError,[mbOK],0);//aqui você pode persolizar a mensagem de erro finally CloseFile(arquivo) end; end;
além de mostra a mensagem de erro crio um arquivo de log, para armazenar o erro ocorrido, sabe quando o cliente diz: ´O amigo de vez enquando ta acontecendo um erro na tela de consulta do teu sistema, eu clico (OK) e passa´ daí vc pergunta: ´Qual o erro que aparece?´ ele diz, não lembro não eu não anotei, mais da uma olhadinha ai... :wink:
então esse log, tem me ajudado muito a descobrir certos erros do meu sistema! :roll:
13/03/2006
Adriano Santos
procedure TfMenu.ApplicationEventsException(Sender: TObject; E: Exception); var NomeDoLog: string; Arquivo: TextFile; begin NomeDoLog := ChangeFileExt(Application.Exename, ´.log´); AssignFile(Arquivo, NomeDoLog); if FileExists(NomeDoLog) then Append(arquivo) else ReWrite(arquivo); try WriteLn(arquivo, ´****************** ´+DateTimeToStr(Now)+ ´ ****************** ´); Writeln(arquivo, ´Erro Ocorrido: ´); Writeln(arquivo,E.Message); Writeln(arquivo, ´Janela: ´+ Screen.ActiveForm.Name + ´ Controle Ativo: ´+Screen.ActiveControl.Name); WriteLn(arquivo, ´----------------------------------------------------------------------´); MessageDlg(´Ocorreu o seguinte erro:´+e.Message,mtError,[mbOK],0);//aqui você pode persolizar a mensagem de erro finally CloseFile(arquivo) end; end;
Realmente o TApplicationEvents é bem eficiente. No meu caso desenvolvi meu próprio componente. Nele faço algo parecido como o que o [b:f6c911c725]PaullSoftware[/b:f6c911c725] disse, mas eu ainda mando por email para o endereço configurado no componente, que no meu caso é o endereço do suporte técnico.
Resumindo: As duas soluções são válidas.
16/03/2006
Paullsoftware
16/03/2006
Martins
é isso aí galera.
16/03/2006
Adriano Santos
[b:f5825418a0]Martins[/b:f5825418a0] acho que entendeu errado. Não desenvolvi o meu componente herdado do TApplicationEvents, fiz do zero (TComponent). Ainda tem uns bugs então preciso colocar forte em produção pra ver no que dá.
A sua idéia não é ruim viu, pensando bem se tivesse feito do TApplicationEvents acredito que ainda seria melhor.
[]s
16/03/2006
Martins
[b:25d66c8f66]Martins[/b:25d66c8f66] acho que entendeu errado. Não desenvolvi o meu componente herdado do TApplicationEvents, fiz do zero (TComponent). Ainda tem uns bugs então preciso colocar forte em produção pra ver no que dá.
A sua idéia não é ruim viu, pensando bem se tivesse feito do TApplicationEvents acredito que ainda seria melhor.
[]s[/quote:25d66c8f66]
Blz então [b:25d66c8f66]Adriano[/b:25d66c8f66] é q pensei q tivesse sido herdado de TApplicationEvents, mas como foi de TComponent, vc deve ter tido q implementar muitas classes, dorzinha de cabeça em irmão. Valew
16/03/2006
Adriano Santos
[b:6333d1c508]Martins[/b:6333d1c508] acho que entendeu errado. Não desenvolvi o meu componente herdado do TApplicationEvents, fiz do zero (TComponent). Ainda tem uns bugs então preciso colocar forte em produção pra ver no que dá.
A sua idéia não é ruim viu, pensando bem se tivesse feito do TApplicationEvents acredito que ainda seria melhor.
[]s[/quote:6333d1c508]
Blz então [b:6333d1c508]Adriano[/b:6333d1c508] é q pensei q tivesse sido herdado de TApplicationEvents, mas como foi de TComponent, vc deve ter tido q implementar muitas classes, dorzinha de cabeça em irmão. Valew[/quote:6333d1c508]
Heheh, até que não viu cara. Não foi muito ruim não, tô até pensando em fazer um artigo para mostrar pra galera. O ruim foi a parte de e-mail, precisei adaptar para Delphi 6 (FastNet) e Delphi 7 (Indy), mas hoje o componente conta apenas com a parte Indy de envio.
24/05/2006
Bertocco
Bom, se for o que estou pensando refere-se ao desvio das exceções para um procedimento personalizado. Isso você fazer apenas redicionando o onException do TApplication para uma procedure que você desenvolva, por exemplo:
procedure MostraErro(Sender: TObject; E: Exception); begin ShowMessage(E.Message); end;
Daí em algum momento vc desvia evento onException do TApplication para sua procedure:
Application.OnException := MostraErro;
Boa Tarde, eu fiz esse exemplo mas dá erro: [Error] Unit1.pas(75): Incompatible types: ´method pointer and regular procedure´
Como resolver esse erro?
Muito obrigado.
24/05/2006
Adriano Santos
[b:c042412139]bertocco[/b:c042412139], pode postar trecho do algoritimo pra que possamos ver como você fez?
24/05/2006
Bertocco
[b:119be36f9b]bertocco[/b:119be36f9b], pode postar trecho do algoritimo pra que possamos ver como você fez?[/quote:119be36f9b]
Ok Estou enviando
procedure MostraErro(Sender: TObject; E: Exception);
begin
ShowMessage(E.Message);
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
sdsTeste.Close;
sdsTeste.Open;
sdsTeste.Append;
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
try
sdsTeste.Post;
sdsTeste.ApplyUpdates(0);
ShowMessage(´Gravado com Sucesso´);
sdsTeste.Close;
except
On E:EDBEngineError do
begin
Raise Exception.Create(´Violação de Chave Primária´);
sdsTeste.Cancel;
end;
end;
end;
procedure TForm1.ApplicationEvents1Exception(Sender: TObject;
E: Exception);
begin
ApplicationEvents1.OnException := MostraErro;
end;
24/05/2006
Adriano Santos
procedure MostraErro(Sender: TObject; E: Exception); begin ShowMessage(E.Message); end;
procedure TForm1.BitBtn1Click(Sender: TObject); begin sdsTeste.Close; sdsTeste.Open; sdsTeste.Append; end;
procedure TForm1.BitBtn2Click(Sender: TObject); begin try sdsTeste.Post; sdsTeste.ApplyUpdates(0); ShowMessage(´Gravado com Sucesso´); sdsTeste.Close; except On E:EDBEngineError do begin Raise Exception.Create(´Violação de Chave Primária´); sdsTeste.Cancel; end; end; end;
procedure TForm1.ApplicationEvents1Exception(Sender: TObject; E: Exception); begin ApplicationEvents1.OnException := MostraErro; end;
[b:5579d9454a]betocco[/b:5579d9454a], desta forma não irá funcionar mesmo pois você está desviando o evento onException do objeto TApplicationEvents para a function [b:5579d9454a]MostraErro[/b:5579d9454a]. O que eu mencionei acima é desviar o onException da aplicação, ou seja, da classe TApplication.
Pra fazer isso vc deve colocar algo como:
procedure TForm1.FormCreate(Sender: TObject); begin Application.onException := MostraErro; end;
Ou você usa esta estrutura ou usa o componente TApplicationEvents que já faz a captura e manipulação dos teus erros dentro da aplicação. Você poderia fazer algo do tipo:
procedure TDM.ApplicationEvents1Exception(Sender: TObject; E: Exception); var mensagem: string; Pos1, Pos2: integer; begin if Pos(UpperCase(´is not a valid date´), UpperCase(E.Message)) <> 0 then ShowMessage(´Data inválida, proceda a correção.´) else if Pos(UpperCase(´must have a value´), UpperCase(E.Message)) <> 0 then begin ShowMessage(´É obrigatório o preenchimento do campo.´); end else ...etc end;
24/05/2006
Bertocco
procedure MostraErro(Sender: TObject; E: Exception); begin ShowMessage(E.Message); end;
procedure TForm1.BitBtn1Click(Sender: TObject); begin sdsTeste.Close; sdsTeste.Open; sdsTeste.Append; end;
procedure TForm1.BitBtn2Click(Sender: TObject); begin try sdsTeste.Post; sdsTeste.ApplyUpdates(0); ShowMessage(´Gravado com Sucesso´); sdsTeste.Close; except On E:EDBEngineError do begin Raise Exception.Create(´Violação de Chave Primária´); sdsTeste.Cancel; end; end; end;
procedure TForm1.ApplicationEvents1Exception(Sender: TObject; E: Exception); begin ApplicationEvents1.OnException := MostraErro; end;
[b:bfe8731c0e]betocco[/b:bfe8731c0e], desta forma não irá funcionar mesmo pois você está desviando o evento onException do objeto TApplicationEvents para a function [b:bfe8731c0e]MostraErro[/b:bfe8731c0e]. O que eu mencionei acima é desviar o onException da aplicação, ou seja, da classe TApplication.
Pra fazer isso vc deve colocar algo como:
procedure TForm1.FormCreate(Sender: TObject); begin Application.onException := MostraErro; end;
Ou você usa esta estrutura ou usa o componente TApplicationEvents que já faz a captura e manipulação dos teus erros dentro da aplicação. Você poderia fazer algo do tipo:
procedure TDM.ApplicationEvents1Exception(Sender: TObject; E: Exception); var mensagem: string; Pos1, Pos2: integer; begin if Pos(UpperCase(´is not a valid date´), UpperCase(E.Message)) <> 0 then ShowMessage(´Data inválida, proceda a correção.´) else if Pos(UpperCase(´must have a value´), UpperCase(E.Message)) <> 0 then begin ShowMessage(´É obrigatório o preenchimento do campo.´); end else ...etc end;
Boa tarde, estou fazendo esse codigo, mas quando eu faço a duplicidade do codigo, aparede a mensagem de gravado com sucesso, não chega aparecer o erro de violação de chave.
Por que acontece isso? Obs.: Estou usando o DBExpress
24/05/2006
Adriano Santos
procedure ...ReconcileError... begin if ClientDataSet.ApplyUdates(0) > 0 then ShowMessage(´Ocorreu um erro.´); end;
[list:2fe6fc9f84]
[*:2fe6fc9f84][b:2fe6fc9f84]ApplyUpdates(0):[/b:2fe6fc9f84] não podem haver erros. Qualquer erro que ocorra, a aplicação das atualizações será paralizada.
[*:2fe6fc9f84][b:2fe6fc9f84]ApplyUpdates(´n´):[/b:2fe6fc9f84] podem haver ´n´ erros. Quando o número de erros atingir ´n´, a aplicação das atualizações será paralizada.
[*:2fe6fc9f84][b:2fe6fc9f84]ApplyUpdates(-1):[/b:2fe6fc9f84] não importa quantos erros existirem, o que puder ser aplicado será.
[/list:u:2fe6fc9f84]
(Palavras do Vinicius2K) rsrs.
Aconselho ´perder´ um pouquinho de tempo lendo uma dicussão (um pouco longa) neste tópico.
Abraço
[url=http://forum.clubedelphi.net/viewtopic.php?t=75031&postdays=0&postorder=asc&start=30]http://forum.clubedelphi.net/viewtopic.php?t=75031&postdays=0&postorder=asc&start=30[/url]
Clique aqui para fazer login e interagir na Comunidade :)