Einzelnen Beitrag anzeigen

Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#4

Re: Exception-Handling: verursachende Function/Procedufe fin

  Alt 1. Dez 2005, 09:29
Zitat von HeikoAdams:
Hallo,
das Grundgerüst steht schon lange
Dein Lösungsvorschlag mit der globalen Variable ist bei einer bestehenden Anwedung mit ca 730.000 Zeilen Code wenig praktikabel.

Gruß
Du kannst natürlich über den Sender der Exception die "auslösende" Komponente inkl. Name etc. auslesen und mit ausgeben, aber das ist sehhhr ungenau. Wenn Du auch nur eine ungefähre Vorstellung hast, woher der Fehler kommen könnte, dann sind mit Sicherheit nur wenige hundert Zeilen betroffen

Ich mach das in einem Programm so:
Delphi-Quellcode:
procedure TMyProg.AppException(Sender: TObject; E: Exception);
var
  MyError: TStringList;
  Comp, Tmp1, Tmp2: string;
begin
  MyError := nil;
  try
    MyError := TStringlist.Create;
    if FileExists(ChangeFileExt(ParamStr(0), '.err')) = True then
    begin
      MyError.LoadFromFile(ChangeFileExt(ParamStr(0), '.err'));
      MyError.Add('');
      MyError.Add('');
    end;
    Tmp2 := 'Exception from ';
    Tmp1 := '';
    while Length(Tmp1) < Length(Tmp2) do
      Tmp1 := Tmp1 + '-';
    Tmp1 := Tmp1 + '-------------------';
    MyError.Add(Tmp1);
    MyError.Add(Tmp2 + FormatDateTime('mm"/"dd"/"yyyy hh":"nn":"ss', Now));
    MyError.Add(Tmp1);
    MyError.Add('');

    //Meldung formatieren...
    Comp := Trim(Sender.ClassName);
    if Comp = 'then
      Comp := 'Application';
    try
      Comp := Comp + '[' + TControl(Sender).Name + ']';
    except
      try
        Comp := Comp + '[!!! ' + E.Message + ']';
      except
      end;
    end;
    Comp := Comp + ': "' + E.Message;
    while pos(#13, Comp) > 0 do
      Comp := copy(Comp, 1, pos(#13, Comp) - 1) + ' ' + Copy(Comp, pos(#13,
        Comp) + 1, Length(Comp));
    Comp := Trim(Comp) + '"';
    if IsEncStarting = True then
    begin
      Comp := Comp + #13#13 + GetResTxt(LangDll, 83);
    end;
    MyError.Add(Comp);

    //Begrenzung
    while MyError.Count > 2000 do
      MyError.Delete(0);
    while (MyError.Count > 0) and (copy(MyError[0], 1, 1) <> '-') do
      MyError.Delete(0);

    MyError.SaveToFile(ChangeFileExt(ParamStr(0), '.err'));

  finally
    MyError.Free;
  end;
  if (pos('closed gracefully', LowerCase(E.Message)) = 0) and (pos('read time',
    LowerCase(E.Message)) = 0) and (IsClosing = False) and (IsEP = False) then
    MessageDlg(E.Message, mtError, [mbOK], 0);
  EncError := True;
  IsEP := False;
end;
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat