Exception Tratamento de Erros

Delphi

18/03/2005

:D E ai galerinha blz espero

Estou montando a biblioteca de tratamento de erros e gostaria de gerar um log no tratamento.
neste log gostaria de colocar o procedimento de onde foi gerado o erro, o nome do arquivo e também a linha.
:shock:
pois é galera só que eu não sei como pegar estes dados automáticamente e na verdade nem sei se é possivel fazer isto.
:?: Tem como
No tratamento de erro saber qual procedure gerou o erro?
No tratamento de erro saber qual linha gerou o erro?
No tratamento de erro saber qual arquivo gerou o erro?

bem acredito questas perguntas não seja um desafio somente para mim..
caso vcs não saibam como fazer desta meneira qualquer sujestão de como fazer isto é bem vinda.


Mitsalito

Mitsalito

Curtidas 0

Melhor post

Mitsalito

Mitsalito

18/03/2005

Era exatamente o que eu estava fazendo ... agora eu vou me preocupar somente em gerar o log e traduzir as mensgens.
Cara vou ganhar uma promoção por sua ajuda :D
Não sei nem o que te dizer ... se vc não este caminho das pedras to pra te falar que eu iria desinstala-lo e não teria visto aquilo ... muito bom excelente .... brigadão


GOSTEI 1

Mais Respostas

Gandalf.nho

Gandalf.nho

18/03/2005

Existem componentes para isso, embora desconheça se existe um tão completo que não seja comercial. Dê uma pesquisada nesses sites de componentes: [url]http://delphi.icm.edu.pl/[/url] e [url]http://www.torry.net/[/url]


GOSTEI 0
Marco Salles

Marco Salles

18/03/2005

Pelo que eu entendi , Voce pode armazenar todo o erro que por ventura ocorra no seu aplicativo em um arquivo Text

Isto serve para voce :?: :?: :?:


GOSTEI 0
Mitsalito

Mitsalito

18/03/2005

O armazenamento e tratamento não é o problema eu queria é pegar também o nome da procedure e o numero da linha que executou o erro.
O Delphi tem alguma função que retorne o numero da linha? por exemplo.


GOSTEI 0
Massuda

Massuda

18/03/2005

Na [url=http://homepages.borland.com/jedi/jcl/]JCL[/url] (Jedi Code Library), tem uma unit chamada JclDebug que deve ser usada em conjunto com o mecanismo do JCL para captura de exceções. Nessa unit tem funções/procedures para determinar o nome do arquivo, da função/procedure, o número da linha.


GOSTEI 0
Mitsalito

Mitsalito

18/03/2005

esta unit está no delphi?


GOSTEI 0
Gandalf.nho

Gandalf.nho

18/03/2005

esta unit está no delphi?


Tem que ser baixada do link que o Massuda forneceu.


GOSTEI 0
Mitsalito

Mitsalito

18/03/2005

Cara vc num teria o nome das procedures que fazem isso para facilitar pro meu lado não?


GOSTEI 0
Mitsalito

Mitsalito

18/03/2005

Ou algum exemplo pois a biblioteca tem objeto pra caramba


GOSTEI 0
Gandalf.nho

Gandalf.nho

18/03/2005

tem uma unit chamada JclDebug que deve ser usada em conjunto com o mecanismo do JCL para captura de exceções. Nessa unit tem funções/procedures para determinar o nome do arquivo, da função/procedure, o número da linha.


Aí está o nome da unit


GOSTEI 0
Rômulo Barros

Rômulo Barros

18/03/2005

[color=darkblue:08b3091f45][b:08b3091f45]Veja se as funções MethodName e MethodAddres podem lhe ajudar:[/b:08b3091f45][/color:08b3091f45]

Link: [url]http://forum.clubedelphi.net/viewtopic.php?t=48275&highlight=[/url]

_____________________________________________
[b:08b3091f45][color=blue:08b3091f45]Utilize a Ferramenta de Pesquisa do Fórum[/color:08b3091f45][/b:08b3091f45]

Pesquisar pelos termos
_____________________________________________
[b:08b3091f45]Veja como[url=http://forum.clubedelphi.net/viewtopic.php?t=16976] OBTER RESPOSTAR RÁPIDAS[/url][/b:08b3091f45]
[b:08b3091f45]Veja as novas [url=http://forum.clubedelphi.net/viewtopic.php?t=59817]MUDANÇAS NA ESTRUTURA[/url] do site[/b:08b3091f45]
[b:08b3091f45]Leia sempre as [url=http://forum.clubedelphi.net/viewtopic.php?t=6689]REGRAS DE CONDUTA[/url][/b:08b3091f45]


GOSTEI 0
Marco Salles

Marco Salles

18/03/2005

Voce consegui abrir a página cara.. Nen a página eu consegui abrir :( :( :(

Da um erro dizendo que : [b:d16a71e9a3]Object Not Found e ERRO 404[/b:d16a71e9a3] :( :( :(

to usando o endereço :

http://homepages.borland.com/jedi/jcl/]JCL[/url]

Mas não consegui Ter acesso a estas Units

tem uma unit chamada JclDebug que deve ser usada em conjunto com o mecanismo do JCL para captura de exceções. Nessa unit tem funções/procedures para determinar o nome do arquivo, da função/procedure, o número da linha.


:cry: :cry: :cry: :cry: :cry: Como acessar :?: :?: :?: :?:


GOSTEI 0
Mitsalito

Mitsalito

18/03/2005

MethodName(Address: Pointer): ShortString; nesta função tenho de ter o ponteiro que representa a procedure ou função

MethodAddress(const Name: ShortString): Pointer; nesta função tenho de ter o nome da procedure;
como faço pra descobrir isso sem ter de passar nada como parametro


GOSTEI 0
Mitsalito

Mitsalito

18/03/2005

CARA este JCL tem muito pouco da utilisação dele na documentação...
TJclMapLineNumberUnitEvent nada declarado na documentação dentre outros objetos que nada ha declarado


GOSTEI 0
Massuda

Massuda

18/03/2005

Na [ulr=http://homepages.borland.com/jedi/jcl/]JCL[/url] (Jedi Code Library), tem uma unit chamada...
:oops: Peço desculpas a todos... Não tinha visto que o link estava formatado errado.

... este JCL tem muito pouco da utilisação dele na documentação...
Esse é o problema de muita coisa open source... o código evolui mais rápido que a documentação, que fica desatualizada (mas isso acontece na maioria dos projetos né :wink: ).

Eu uso o JCL basicamente para ter um tratamento para exceções não tratadas. Acho que é mais ou menos o que você quer fazer e é, em parte, o que o [url=http://www.madshi.net/]Mad Exception[/url] faz.

Tomando por base a versão do JCL que estou usando (v.1.90), eu costumo utilizar...[list:497441a00a][*:497441a00a]AssertKindOf[*:497441a00a]TraceLoc[*:497441a00a]FileByLevel/ProcByLevel/LineByLevel[*:497441a00a]FileOfAddr/ProcOfAddr/LineOfAddr[*:497441a00a]IsDebuggerAttached[/list:u:497441a00a]Tudo isso está mais ou menos documentado ou não é difícil de entender como usar depois de fazer alguns testes com elas.

O problema maior é saber como preparar o executável para poder usar essas funções. Acho que a documentação nem fala sobre isso.

Lá vai a ´receita do bolo´:[list=1:497441a00a][*:497441a00a]Na instalação do JCL, marque a opção [b:497441a00a]IDE experts/Debug extension[/b:497441a00a] e marque a opção [b:497441a00a]Sample exception dialogs[/b:497441a00a].[*:497441a00a]De volta a IDE, abra seu projeto[*:497441a00a]Dê [b:497441a00a]File/New/Other.../Dialogs[/b:497441a00a][*:497441a00a]Dê um clique duplo no ícone do [b:497441a00a]Exception Dialog[/b:497441a00a][*:497441a00a]Salve seu projeto dando um [b:497441a00a]File/Save all[/b:497441a00a][*:497441a00a]Marque a opção [b:497441a00a]Project/Insert JCL Debug Data[/b:497441a00a][*:497441a00a]Dê um [b:497441a00a]Project/Build[/b:497441a00a] (um dialog box adicional do JCL irá aparecer se o build for bem sucedido)[/list:o:497441a00a]Se você optar por não utilizar a janela de exceção do JCL, não precisa fazer os passos 3-4-5. Entretanto, vale a pena testar pelo menos uma vez essa caixa de diálogo e dar uma olhada como o relatório de erro é criado (na função CreateReport).


[b:497441a00a]Mensagem editada![/b:497441a00a]
[quote:497441a00a=´Massuda´]
Na [ulr=http://homepages.borland.com/jedi/jcl/]JCL[/url] (Jedi Code Library), tem uma unit chamada...
:oops: Peço desculpas a todos... Não tinha visto que o link estava formatado errado.[/quote:497441a00a]
Massuda,

Link corrigido.
Sandra/moderação


GOSTEI 0
Massuda

Massuda

18/03/2005

Cara vou ganhar uma promoção por sua ajuda
Ei! Não cante vitória ainda, espere funcionar!

Agora... tome nota das pegadinhas:[list:c75e5b9433][*:c75e5b9433]Nunca, em hipótese alguma, compacte seu executável (em particular com o UPX). Esses compactadores de executável costumam alterar os endereços de carga dos módulos... o endereço de uma função/procedure quando o executável é gerado fica diferente do endereço quando o executável é usado, resultado: as informações que você captura na exceção estão todas erradas![*:c75e5b9433]Exceções que ocorrem muito cedo (na inicialização das units) ou muito tarde (na finalização das units) costumam não ser capturadas por qualquer mecanismo de captura de exceções que você imaginar; para evitar isso, vá no fonte do seu DPR e garanta que a unit que inicializa seu mecanismo de captura de exceções seja a primeita unit da lista (difícil de fazer, especialmente se você usa a unit ShareMem)[/list:u:c75e5b9433]


GOSTEI 0
Massuda

Massuda

18/03/2005

Esqueci o mais importante...

Cara vou ganhar uma promoção por sua ajuda
:lol: Aguardo uma contribuição significativa sua no meu banco de horas :lol: Segue dados para depósito via MP :lol:


GOSTEI 0
Mitsalito

Mitsalito

18/03/2005

Cara valeu mesmo.
O incrivel é que na tela ele traz tudo nos detalhes o unico trabalho que vou ter é de salvar para log e programar o botão para enviar por email os dados colhidos pelo debug.
Quanto a compactar executaveis ... eu particularmente não sou a favor disso.
Já sobre a inicialisação não entendi muito bem, não encontrei este ShareMem somente estou usando o ExceptionDialog, no mais o que farei é implementar o codigo que nele está para traduzir as mensagens e salvar automáticamente o log para se ter um historico dos erros ocorridos.

Mais uma pergunta ... tem alguma coisa a mais que terei de ter para instalar o meu software por conta desta biblioteca?


GOSTEI 0
Massuda

Massuda

18/03/2005

... tem alguma coisa a mais que terei de ter para instalar o meu software por conta desta biblioteca?
Que eu me lembre... não.

Agora, se você desabilitar a opção [b:e4bb666002]Project/Insert JCL Debug Data[/b:e4bb666002], terá de gerar um mapa completo de linkagem do programa e distribuir esse arquivo (.MAP) junto com seu programa. Mas é muito mais cômodo deixar a opção habilitada.


GOSTEI 0
Christian_adriano

Christian_adriano

18/03/2005

Olá colega Massuda,

como o nosso colega ´Mitsalito´ já tinha falando antes, como eu pego o nome do método pra passar como paramento para ´MethodAddress´ ?

O que estou tentando fazer é o seguinte, quero q quando ocorra uma exceção na aplicação, apareça também o nome do Método na msg de erro.

Tem alguma ideia de como fazer isso ?

Desde já agradeço pela atenção.

[]´s.


GOSTEI 0
Massuda

Massuda

18/03/2005

...quero q quando ocorra uma exceção na aplicação, apareça também o nome do Método na msg de erro.
MethodName/MethodAddress não serve para isso que você pretende fazer.

O uso normal dessas procedures é no mecanismo de gravar ler dados de objetos do DFM.

Essas procedures só funcionam com coisas que são classes, não funcionam com functions/procedures que não são parte de uma classe.


GOSTEI 0
Christian_adriano

Christian_adriano

18/03/2005

Olá Massuda,


muito obrigado por responder... então tem uma outra forma de se fazer o que eu quero ?


Obrigado.

[]´s.


GOSTEI 0
Massuda

Massuda

18/03/2005

Leia atentamente este tópico... aqui está explicado como fazer isso usando o JCL. Você pode pesquisar o fórum por MadExcept para ver uma implementação alternativa.


GOSTEI 0
Erisvaldo Silva

Erisvaldo Silva

18/03/2005

Alguém com a mesma situação em 2018?
GOSTEI 0
POSTAR