Retornar erros do sistema em message

12/03/2006

Bom dia,

Pessoal preciso de um código que retorno que o erro do sistema em um message definido pelo programador..

Att,

Wagner


Wagnermarrane

Respostas

12/03/2006

Aroldo Zanela

Colega,

Você pode esclarecer um pouco mais? Você se refere a tratamento de exceções personalizadas? Pode citar um exemplo?


Responder Citar

13/03/2006

Adriano Santos

Bom dia, Pessoal preciso de um código que retorno que o erro do sistema em um message definido pelo programador.. Att, Wagner


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;



Responder Citar

13/03/2006

Paullsoftware

Eu faço de duas maneiras...
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&93;,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:


Responder Citar

13/03/2006

Adriano Santos

Eu faço de duas maneiras... na paleta Additional (Delphi7) tem o componente [b:f6c911c725][i:f6c911c725]´ApplicationEvents´[/i:f6c911c725][/b:f6c911c725] 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&93;,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:


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.


Responder Citar

16/03/2006

Paullsoftware

Realmente o TApplicationEvents é bem eficiente. No meu caso desenvolvi meu próprio componente. Nele faço algo parecido como o que o PaullSoftware 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.
é isso ai adriando eu também faço, mais apenas em sistema que vendi para uma escola de formataleza/ceará, senão ficaria complicado dar suporte a eles :lol:


Responder Citar

16/03/2006

Martins

Sem dúvidas que desenvolver um componente derivado de [b:d2eaa26640]TApplicationEvents[/b:d2eaa26640] é muito bom e importante na hora do suporte, ainda mais quando definimos no mesmo o tipo de informações q necessitamos para melhor atender nossos cliente, tipo de erro - mensagem, unit ou dfm q apresentou o erro, etc...

é isso aí galera.


Responder Citar

16/03/2006

Adriano Santos

Sem dúvidas que desenvolver um componente derivado de [b:f5825418a0]TApplicationEvents[/b:f5825418a0] é muito bom e importante na hora do suporte, ainda mais quando definimos no mesmo o tipo de informações q necessitamos para melhor atender nossos cliente, tipo de erro - mensagem, unit ou dfm q apresentou o erro, etc... é isso aí galera.


[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


Responder Citar

16/03/2006

Martins

[quote]Sem dúvidas que desenvolver um componente derivado de [b:25d66c8f66]TApplicationEvents[/b:25d66c8f66] é muito bom e importante na hora do suporte, ainda mais quando definimos no mesmo o tipo de informações q necessitamos para melhor atender nossos cliente, tipo de erro - mensagem, unit ou dfm q apresentou o erro, etc... é isso aí galera.


[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


Responder Citar

16/03/2006

Adriano Santos

[quote:6333d1c508=´Adriano Santos´][quote:6333d1c508=´Martins´]Sem dúvidas que desenvolver um componente derivado de [b:6333d1c508]TApplicationEvents[/b:6333d1c508] é muito bom e importante na hora do suporte, ainda mais quando definimos no mesmo o tipo de informações q necessitamos para melhor atender nossos cliente, tipo de erro - mensagem, unit ou dfm q apresentou o erro, etc... é isso aí galera.


[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.


Responder Citar

24/05/2006

Bertocco

[quote]Bom dia, Pessoal preciso de um código que retorno que o erro do sistema em um message definido pelo programador.. Att, Wagner


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;
[/quote:50f4c69cd6]


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.


Responder Citar

24/05/2006

Adriano Santos

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.


[b:c042412139]bertocco[/b:c042412139], pode postar trecho do algoritimo pra que possamos ver como você fez?


Responder Citar

24/05/2006

Bertocco

[quote] 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.


[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;


Responder Citar

24/05/2006

Adriano Santos

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;


[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;



Responder Citar

24/05/2006

Bertocco

[quote] 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;


[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;
[/quote:bfe8731c0e]

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


Responder Citar

24/05/2006

Adriano Santos

Você deve estar se referindo as exceções do ClientDataSet certo? O ClientDataSet nunca gera exceções como no BDE por exemplo. Todo e qualquer erro deve ser capturado e tratado pelo evento onReconcileError do ClientDataSet. O ApplyUpdates retorna o número de erros ocorridos na operação, desta forma basta testar. Veja:


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]


Responder Citar