Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi wie sicher ist diese procedure? (https://www.delphipraxis.net/33440-wie-sicher-ist-diese-procedure.html)

tn249 7. Nov 2004 00:03


wie sicher ist diese procedure?
 
hi,

ich arbeit momentan an einem ( für meine verhältnisse ) größerem projekt und hab darin auch die ansätze eines eigenen debugsystems verankert

ein teil davon ist die folgende procedure;
Delphi-Quellcode:
procedure Log(Text: string);
var
  LogFile: TextFile;
  TDTempStr: string;
begin
  DateTimeToString(TDTempStr, 'dd.mm.yyyy hh:nn:ss', Now());
  TDTempStr := TDTempStr + ': ' + Text;
  AssignFile(LogFile, 'Data/Log.txt');
  Append(LogFile);
  Writeln(LogFile, TDTempStr);
  Flush(LogFile);
  CloseFile(LogFile);
end;
die procedure soll einfach nur markante erledigte aufgaben dokumentieren, mit timestamp


ich habe gesehen das viele von euch mit try..expect / finally arbeiten und würde gerne wissen wann ihr das macht um welche fehler genau abzufangen und wie ihr die obere procedure ändern würdet?

Vielen Dank im voraus
MfG
tn_der_pate

Jelly 7. Nov 2004 01:04

Re: wie sicher ist diese procedure?
 
Hallo,

knallen wirds in 2 Fällen:
1) Deine Logfile existiert noch nicht, dann klappt Append nicht
2) Deine Logfile ist Read-only

Ich würd also noch nach Existenz der Logfile prüfen, und gegebenfalls Append rsp. Rewrite nutzen.

Sharky 7. Nov 2004 07:31

Re: wie sicher ist diese procedure?
 
Hai,

ich würde, so wie Jelly es vorgeschlagen hat, prüfen ob die Logdatei vorhanden ist.
Ausserdem solltest Du in jedem Fall mit try-except Blöcken arbeiten. Da es ja für dein "Debugsystem" ist musst Du dafür sorgen das die Funktion auf keinen Fall selber einen Fehlerverursacht der dein Programm zum Absturz bring ;-)
Das hier wäre eine möglichkeit. Wenn Du den except-Teil noch verfeinerst kannst Du in deinem Programm noch auswerten warum der Aufruf der Funktion fehlgeschlagen ist.

Delphi-Quellcode:
function Log(Text: string) : Integer;
const
  filename = 'Data/Log.txt';

var
  LogFile: TextFile;
  TDTempStr: string;
  errorlevel : Integer;

begin
  errorlevel := 0; // Keine Fehler
  try
    DateTimeToString(TDTempStr, 'dd.mm.yyyy hh:nn:ss', Now());
    TDTempStr := TDTempStr + ': ' + Text;
    AssignFile(LogFile, filename);
    if not (FileExists(filename)) then
    begin
      Rewrite(logfile);
    end
    else
    begin
      Append(LogFile);
    end;
    Writeln(LogFile, TDTempStr);
    Flush(LogFile);
    CloseFile(LogFile);
  except
    errorlevel := 1; // Fehler
  end;
  result := errorlevel;
end;

Jens Schumann 7. Nov 2004 08:03

Re: wie sicher ist diese procedure?
 
Hallo
Zitat:

Zitat von tn249
... ich habe gesehen das viele von euch mit try..expect / finally arbeiten und würde gerne wissen wann ihr das macht um welche fehler genau abzufangen...

Grundsätzlich immer wenn das Programm Speicher anfordert o. Objekte erzeugt werden.
Beispiel
Delphi-Quellcode:
var
  Liste : TStringList;
begin
  Liste:=TStringList.Create;
  Try
    ...
    Liste.LoadFromFile(...); // Hier kann immer etwas schief gehen
    ...
  Finally
    Liste.Free
    end;
end;
Try Finally/Except ist auch immer angesagt, wenn das Programm auf irgendetwas externes zugreift.
Z.B. Schnittstellen, Festplatte, COM/DCOM, LAN usw. Denn diese Dinge liegen außerhalb Deines
Machtbereiches. D.h. da kann alles passieren.

himitsu 7. Nov 2004 08:06

Re: wie sicher ist diese procedure?
 
Bei mir läuft Folgendes. ^^

Ich hab da allerdings noch 'ne Log-Anzeige mitlaufen ...

Delphi-Quellcode:
  Procedure TForm1.Log_Add(S: String);
    Const Dateiname = 'Verwaltung-Log.txt';

    Var D: TextFile;

    Begin
      AssignFile(D, Dateiname);
      {$I-}
      Append(D);
      If IOResult <> 0 Then Rewrite(D);
      If IOResult <> 0 Then
        If FileExists(Dateiname) Then Begin
          FileSetAttr(Dateiname, FileGetAttr(Dateiname) and not (faReadOnly or faHidden or faSysFile));
          Append(D);
        End Else Rewrite(D);
      {$I-}
      If S = '' Then WriteLn(D, '') Else WriteLn(D, DateTimeToStr(Now, FormatSettingsLang) + ' ' + S);
      Flush(D);
      CloseFile(D);
      Memo094.Lines.BeginUpdate;
      While Memo094.Lines.Count > 17 do Memo094.Lines.Delete(0);
      Memo094.Lines.Add(TimeToStr(Now) + ' ' + S);
      Memo094.Lines.EndUpdate;
      Application.ProcessMessages;
    End;

tn249 7. Nov 2004 12:32

Re: wie sicher ist diese procedure?
 
Vielen dank schonmal für die antworten

könnt ihr mir noch erklären wann man try finally und wann try except hernimmt?

MfG
tn_der_pate

thklingler 7. Nov 2004 12:39

Re: wie sicher ist diese procedure?
 
Hallo, manchmal hilft es wenn man die Delphihilfe liest.

Text unten ist direkt von dort kopiert.




In einer try...except-Anweisung werden zuerst die Programmzeilen in Anweisungsliste ausgeführt. Werden dabei keine Exceptions ausgelöst, wird ExceptionBlock ignoriert und die Steuerung an den nächsten Programmteil übergeben.


In manchen Situationen muss sichergestellt sein, dass bestimmte Operationen auch bei Auftreten einer Exception vollständig abgeschlossen werden. Wenn beispielsweise in einer Routine eine Ressource zugewiesen wird, ist es sehr wichtig, dass sie unabhängig von der Beendigung der Routine wieder freigegeben wird. In diesen Fällen können try...finally-Anweisungen verwendet werden.

tn249 9. Nov 2004 22:00

Re: wie sicher ist diese procedure?
 
danke nochmal

MfG
tn


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz