Alguem sabe como pegar a linha do ero

Delphi

21/06/2005

Galera estou usando o AplicationEventes para pegar exeções da minha aplicação só que eu quero pegar a unit que gerou e a linha. Como eu faço isto eu sei que o assert() faz isto mais ai eu teria que colocar em todos as minha instruçoes e em todas units tem outro jeito?


Leonardobhbr

Leonardobhbr

Curtidas 0

Respostas

Nigro

Nigro

21/06/2005

Olá amigo estou com o mesmo problema, estou pesquisando, se achar a resposta, coloco aqui, ou você já encontrou como proceder?


GOSTEI 0
Massuda

Massuda

21/06/2005

Pesquise o fórum por ´JCL debug´ ou ´MadExcept´.


GOSTEI 0
Adriano Santos

Adriano Santos

21/06/2005

Eu fiz um componente que captura algumas informações sobre o erro. O trecho é este:

procedure TDcCaptureErro.Execute(Sender: TObject; E: Exception);
var
  Arquivo: TextFile;
  NomeAlias: TStringList;
  NomeBDECFG: TRegistry;
  fFor: Integer;
  fTpObjeto: string;
  function ReplaceStr(Caracter: string; Quantidade: Integer): string;
  var
    I: Integer;
  begin
    Result := ´´;
    for I := 0 to Quantidade - 1 do
      Result := Result + Caracter;
  end;
begin
  if (FAtivo) and not (csDesigning in ComponentState) then
  begin
    if (Sender.ClassName <> TForm.ClassName) then
      fTpObjeto := Sender.ClassName
    else
      fTpObjeto := TForm(Sender).Parent.Name;
    if not DirectoryExists(FDiretorioErro) then
      ForceDirectories(FDiretorioErro);
    AssignFile(Arquivo, FDiretorioErro + FNomeArqErro);
    ReWrite(Arquivo);
    Append(Arquivo);
    try
      FErro := E.Message;
      WriteLn(Arquivo, ´Relatório de erros gerado pelo Sistema.´);
      WriteLn(Arquivo, ReplaceStr(´-´, 50));
      WriteLn(Arquivo, ´Descrição do erro..: ´ + E.Message);
      WriteLn(Arquivo, ´Código erro Windows: ´ + IntToStr(IOResult));
      WriteLn(Arquivo, ´Sistema............: ´ + TApplication(Sender).ExeName);
      WriteLn(Arquivo, ´Empresa............: ´ + FCliente);
      WriteLn(Arquivo, ´Usuário ativo......: ´ + FUsuario);
      WriteLn(Arquivo, ´DATA/HORA: ´ + DateToStr(Date) + ´ - ´ +
        TimeToStr(Time));
      WriteLn(Arquivo, ReplaceStr(´-´, 50));
      WriteLn(Arquivo, ´Informações sobre banco de dados´);
      WriteLn(Arquivo, ´ALIASES ATIVOS´);
      NomeAlias := TStringList.Create;
      Session.GetAliasNames(NomeAlias);
      for fFor := 0 to NomeAlias.Count - 1 do
      begin
        WriteLn(Arquivo, ReplaceStr(´ ´, 20) + ´> ´ + NomeAlias[fFor]);
      end;
      NomeAlias.Free;
      NomeBDECFG := TRegistry.Create;
      NomeBDECFG.RootKey := HKEY_LOCAL_MACHINE;
      if NomeBDECFG.RegistryConnect(´´) then
      begin
        if NomeBDECFG.OpenKey(´SOFTWARE\BORLAND\DATABASE ENGINE´, False) then
        begin
          WriteLn(Arquivo, ´CFG ativo : ´ +
            NomeBDECFG.ReadString(´CONFIGFILE01´));
        end;
      end;
      NomeBDECFG.CloseKey;
      NomeBDECFG.Free;
      WriteLn(Arquivo, ´Erro chamado pelo objeto : ´ + TComponent(Sender).Name);
      WriteLn(Arquivo, ´Erro gerado pelo form : ´ + TComponent(Sender).Owner.Name);
      WriteLn(Arquivo, ´Caption do Form: ´ + TForm(TComponent(Sender).Owner).Caption);
      FEmpresa.FConexao.FAnexo := FDiretorioErro + FNomeArqErro;
    finally
      CloseFile(Arquivo);
    end;
    ChamaForm(Sender);
  end;
end;


O componente não está finalizado, mas dá pra tirar algum proveito.
As linhas que capturam algumas informações interessantes estão no final:
      WriteLn(Arquivo, ´Erro chamado pelo objeto : ´ + TComponent(Sender).Name);
      WriteLn(Arquivo, ´Erro gerado pelo form : ´ + TComponent(Sender).Owner.Name);
      WriteLn(Arquivo, ´Caption do Form: ´ + TForm(TComponent(Sender).Owner).Caption);
      FEmpresa.FConexao.FAnexo := FDiretorioErro + FNomeArqErro;

Aqui eu capturo o objeto que causou a exceção assim como o form que ele está alocado. Eu gravo isso em um arquivo no diretório da aplicação que posteriormente pode ser enviado para o ´suporte´ técnico. É bem interessante. Eu parei o desenvolvimento na detecção de internet, ou seja, se o componente perceber que tem internet habilitado ele aciona um botão de envio que pode ser usado pra enviar o arquivo direto pra algum e-mail.

O texto gerado é mais ou menos como este:

Relatório de erros gerado pelo Sistema.
--------------------------------------------------
Descrição do erro..: Access violation at address 00000000. Read of address 00000000
Código erro Windows: 0
Sistema............: D:\Delphi Developer\Components\Common\D7-2006-2007\DcLibrary\DcCaptureErro\Demo\Project1.exe
Empresa............: Reality Construtora
Usuário ativo......: Anônimo
DATA/HORA: 4/5/2007 - 22:19:00
--------------------------------------------------
Informações sobre banco de dados
ALIASES ATIVOS
                    > DBDEMOS
                    > DefaultDD
                    > IBLocal
                    > Banco de dados do MS Access
                    > Arquivos do Excel
                    > Arquivos do dBASE
CFG ativo : C:\Arquivos de programas\Arquivos comuns\Borland Shared07\BDE\IDAPI32.CFG
Erro chamado pelo objeto : Button1
Erro gerado pelo form : frmClientes
Caption do Form: Este é o caption do form


Se quiser pegar pra estudar ou até ajudar a terminá-lo o link pro arquivo está disponível no meu blog:

http://www.delphitodelphi.blogspot.com (DcCaptureErro)

Abs


GOSTEI 0
POSTAR