Einzelnen Beitrag anzeigen

Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#39

AW: Zwei Windows Explorer starten und nebeneinander bildschirmfüllend positionieren

  Alt 11. Jul 2016, 15:22
Zitat:
Wozu die ganzen Try-Except-Blöcke, wenn sie doch leer sind?
Die sollen doch leer sein. Mein Motto lautet: Geht was schief, dann bitte alles in den ErrorLog... Kann der nicht erstellt werden, dann bitte gar nichts machen.
Wenn etwas nicht so läuft wie ich es erwarte, dann habe ich alles an einer Stelle im ErrorLog, sehe ich keinen, dann konnte er wohl nicht erstellt werden.
Das ist ja auch durchaus legitim, aber dazu reichen einige wenige Exception / Finally Blöcke. Außerdem umschließt du sehr viele Befehle mit Exception Blöcken, bei denen es unmgölich ist, dass überhaupt eine Exception auftritt.

Beim von Luckie schon angesprochenen kontraproduktivem Auslagern von FreeAndNil in eine extra Methode platzierst du beispielsweise einen leeren try..except Block, der niemals greifen kann. Deine StringList erzeugst du ja vorher schon in einem try..finally Resourcen-Schutzblock. Sprich: Die List ist auf jeden Fall erstellt, also kann Free gar nicht fehlschlagen. Dass FreeAndNil hier unnötigt ist, hat Luckie ja auch schon erwähnt. Konkret wäre dies die korrekte Herangehensweise:
Delphi-Quellcode:
SL := TStringList.Create;
try
  // ..
finally
  SL.Free;
end;
Andere Stelle: MSDN-Library durchsuchenEnumWindows. Darauf dass diese API eine Exception schmeißt, kannst du lange warten. Windows APIs besitzen einen Rückgabewert, der geprüft werden muss und schmeißen generell keine Exceptions (von seltenen CPU-Exceptions vielleicht mal abgesehen).

Dann sind an einigen Stellen die Resourcen-Schutzblöcke falsch positioniert. Die ErrorLogExists Funktion sollte beispielsweise eher so aussehen:
Delphi-Quellcode:
function ErrorLogExists: Boolean;
begin
  Result := false;
  if FileExists('ErrorLog.txt') then
  begin
    slLoad := TStringlist.Create;
    try
      slLoad.LoadFromFile('ErrorLog.txt');
      strErrorLog := slLoad.Text;
      Result := true;
    finally
      slLoad.Free;
    end;
  end;
end;
Also erst die StringList erzeugen und dann den Resourcen-Schutzblock mit try einleiten. Wichtig ist, dass das Create nicht mit im Block ist, sonst ist nicht garantiert, dass das Free im finally Block funktioniert.

Dieser Artikel könnte für dich auch noch interessant sein:
http://eurekalog.blogspot.de/2010/05...09-and_05.html
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat