Avatar billede hugopedersen Nybegynder
05. marts 2010 - 07:43 Der er 6 kommentarer og
1 løsning

Andre oplysninger end E.Message

Min fejlhåndtering inkluderer nedenstående som skriver meddelelsen i min logfil. Men jeg ville egentlig også gerne vide hvor fejlen er opstået - altså f.eks. navnet på den procedure eller funktion der har genereret meddelelsen.

Kan det kringles?

on E: exception do
  begin
    Logfile.Error(E.Message);
  end
Avatar billede vallemanden Nybegynder
05. marts 2010 - 09:25 #1
Avatar billede hugopedersen Nybegynder
05. marts 2010 - 09:42 #2
Den bruger jeg allerede.
Avatar billede mortvader Nybegynder
05. marts 2010 - 19:59 #3
Du kunne starte hver procedure/function med at opdatere en global variabel med procedurens/functionens navn, og så sende den med efter e.message..
Avatar billede arne_v Ekspert
05. marts 2010 - 20:20 #4
Et grundliggende problem er at en EXE oversat med optimize uden debug ikke har hverken navne eller linie numre d.v.s. at de kan ikke puttes ind automatisk.

Du bliver formentligt nød til at bide i det sure æble og manuelt skrive den information som skal i log filen for at identificere hvor det sker.

Enesten anden ide jeg kan komme på er en præprocessor som erstatte __FILE__, __LINE__, __PROC__ etc. med den rigtige tekst.
Avatar billede hugopedersen Nybegynder
10. marts 2010 - 12:24 #5
arne_v> den sidste linie fik jeg måske fejl i halsen - hvad er det lige du mener.


Smid i øvrigt gerne svar så jeg kan lukke igen.
Avatar billede arne_v Ekspert
11. marts 2010 - 03:28 #6
C:\>type prep.pas
program prep;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  f1, f2 : text;
  line : string;
  n : integer;

begin
  assign(f1, ParamStr(1));
  assign(f2, ParamStr(2));
  reset(f1);
  rewrite(f2);
  n := 0;
  while not eof(f1) do begin
    inc(n);
    readln(f1, line);
    line := StringReplace(line, '__FILE__', '''' + ParamStr(1) + '''', [rfReplaceAll]);
    line := StringReplace(line, '__LINE__', '''' + IntToStr(n) + '''', [rfReplaceAll]);
    writeln(f2, line);
  end;
  close(f2);
  close(f1);
end.
C:\>type dump.pps
program dump;

{$APPTYPE CONSOLE}

procedure sub2;

begin
  writeln('File: ',__FILE__,' Line: ',__LINE__);
end;

procedure sub1;

begin
  writeln('File: ',__FILE__,' Line: ',__LINE__);
  sub2;
end;

begin
  sub1;
end.

C:\>dcc32 prep.pas
Borland Delphi Version 15.0
Copyright (c) 1983,2002 Borland Software Corporation
prep.pas(28)
29 lines, 0.03 seconds, 31216 bytes code, 3893 bytes data.

C:\>prep dump.pps dump.pas

C:\>dcc32 dump.pas
Borland Delphi Version 15.0
Copyright (c) 1983,2002 Borland Software Corporation
dump.pas(21)
22 lines, 0.03 seconds, 10700 bytes code, 1801 bytes data.

C:\>dump
File: dump.pps Line: 14
File: dump.pps Line: 8
Avatar billede arne_v Ekspert
11. marts 2010 - 03:29 #7
Og et svar.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester