Array
(
)

Retornar erros do sistema em message

Wagnermarrane
   - 12 mar 2006

Bom dia,

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

Att,

Wagner


Aroldo Zanela
   - 12 mar 2006

Colega,

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


Adriano Santos
   - 13 mar 2006


Citação:
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:

#Código


procedure MostraErro(Sender: TObject; E: Exception);
begin
ShowMessage(E.Message);
end;


Daí em algum momento vc desvia evento onException do TApplication para sua procedure:

#Código

Application.OnException := MostraErro;



Paullsoftware
   - 13 mar 2006

Eu faço de duas maneiras...
na paleta Additional (Delphi7) tem o componente ´ApplicationEvents´ 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:
#Código


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:


Adriano Santos
   - 13 mar 2006


Citação:
Eu faço de duas maneiras...
na paleta Additional (Delphi7) tem o componente ´ApplicationEvents´ 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:
#Código


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:

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.

Resumindo: As duas soluções são válidas.


Paullsoftware
   - 16 mar 2006


Citação:
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:


Martins
   - 16 mar 2006

Sem dúvidas que desenvolver um componente derivado de TApplicationEvents é 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.


Adriano Santos
   - 16 mar 2006


Citação:
Sem dúvidas que desenvolver um componente derivado de TApplicationEvents é 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.


Martins 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


Martins
   - 16 mar 2006


Citação:

Citação:
Sem dúvidas que desenvolver um componente derivado de TApplicationEvents é 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.


Martins 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


Blz então Adriano é 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


Adriano Santos
   - 16 mar 2006


Citação:

Citação:

Citação:
Sem dúvidas que desenvolver um componente derivado de TApplicationEvents é 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.


Martins 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


Blz então Adriano é 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



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.


Bertocco
   - 24 mai 2006


Citação:

Citação:
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:

#Código


procedure MostraErro(Sender: TObject; E: Exception);
begin
ShowMessage(E.Message);
end;


Daí em algum momento vc desvia evento onException do TApplication para sua procedure:

#Código

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.


Adriano Santos
   - 24 mai 2006


Citação:

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.


bertocco, pode postar trecho do algoritimo pra que possamos ver como você fez?


Bertocco
   - 24 mai 2006


Citação:

Citação:

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.


bertocco, pode postar trecho do algoritimo pra que possamos ver como você fez?


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;


Adriano Santos
   - 24 mai 2006


Citação:

Ok Estou enviando

#Código


procedure MostraErro(Sender: TObject; E: Exception);
begin
ShowMessage(E.Message);
end;


#Código

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
sdsTeste.Close;
sdsTeste.Open;
sdsTeste.Append;
end;


#Código

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;


#Código

procedure TForm1.ApplicationEvents1Exception(Sender: TObject;
E: Exception);
begin
ApplicationEvents1.OnException := MostraErro;
end;



betocco, desta forma não irá funcionar mesmo pois você está desviando o evento onException do objeto TApplicationEvents para a function MostraErro. O que eu mencionei acima é desviar o onException da aplicação, ou seja, da classe TApplication.

Pra fazer isso vc deve colocar algo como:


Citação:

#Código

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:

#Código

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;



Bertocco
   - 24 mai 2006


Citação:

Citação:

Ok Estou enviando

#Código


procedure MostraErro(Sender: TObject; E: Exception);
begin
ShowMessage(E.Message);
end;


#Código

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
sdsTeste.Close;
sdsTeste.Open;
sdsTeste.Append;
end;


#Código

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;


#Código

procedure TForm1.ApplicationEvents1Exception(Sender: TObject;
E: Exception);
begin
ApplicationEvents1.OnException := MostraErro;
end;



betocco, desta forma não irá funcionar mesmo pois você está desviando o evento onException do objeto TApplicationEvents para a function MostraErro. O que eu mencionei acima é desviar o onException da aplicação, ou seja, da classe TApplication.

Pra fazer isso vc deve colocar algo como:


Citação:

#Código

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:

#Código

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


Adriano Santos
   - 24 mai 2006

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:


#Código


procedure ...ReconcileError...
begin
if ClientDataSet.ApplyUdates(0) > 0 then
ShowMessage(´Ocorreu um erro.´);
end;


[list:2fe6fc9f84]
[*:2fe6fc9f84]ApplyUpdates(0): não podem haver erros. Qualquer erro que ocorra, a aplicação das atualizações será paralizada.
[*:2fe6fc9f84]ApplyUpdates(´n´): podem haver ´n´ erros. Quando o número de erros atingir ´n´, a aplicação das atualizações será paralizada.
[*:2fe6fc9f84]ApplyUpdates(-1): 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]