Einzelnen Beitrag anzeigen

Rackergen2

Registriert seit: 13. Jul 2004
99 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Falsche Verwendung von try...except...end

  Alt 20. Jul 2004, 18:39
Zitat von shmia:
Delphi-Quellcode:
// 5. Sünde
// try...except wird verwendet, um eine Resource (Speicher, Handles,...) zu schützen
// Resourcen werden mit einem Resourceschlutzblock (try...finally) geschützt und nicht
// mit einem falsch verstandenem try...except
// in folgendem Beispiel wird try..except falsch verwendet
  sl:=TStringList.create;
  sl.add('[autorun]');
  sl.add('OPEN='+app);
  sl.add('ICON='+icon);
  if copy(destfile, length(destfile)-4, 4)<>'.infthen destfile:=destfile+'.inf';

  try
    sl.SaveToFile(destfile);
  except
    result:=false;
  end;
  sl.free;
Du hast da was falsch verstanden! Das Result:=false soll einer Funktion sagen, dass das Speichern nicht erfolgreich war und nicht die Ressource schützen!

Diese Verwendung sollte keinerlei Auswirkungen auf den Schutz haben, sondern vielmehr einen Funktionswert zurückgeben...

Wenn du dich schon beschweren willst, dann schreib wenigstens die ganze Funktion auf!

Delphi-Quellcode:
function TForm1.CreateAutorunFile(app, icon, destfile: String): boolean;
var
  sl: TStringList;
begin
  result:=true; //im Grunde erfolgreich
  sl:=TStringList.create; //TStringlist erstellen
  sl.add('[autorun]'); //Zeilen schreiben
  sl.add('OPEN='+app); //-"-
  sl.add('ICON='+icon); //-"-
  if copy(destfile, length(destfile)-4, 4)<>'.infthen destfile:=destfile+'.inf'; //im Zweifelsfall Endung anhängen

  try
    sl.SaveToFile(destfile); //Speicherversuch
  except
    result:=false; //Gescheitert? Dann false zurückgeben
  end;

  sl.free; //Ressource wieder freigeben
end;
Natürlich hätte man das Ganze durch try...finally schützen können, aber das hielt ich in dem Fall nicht für nötig! Und im Fall einer Wertezuweisung in einer Funktion ist das hier ebenso falsch, weil eine Sicherung NIE GEPLANT war...

Delphi-Quellcode:
sl:=TStringList.create; // Resource belegen
  try // direkt danach folgt das try
    sl.add('[autorun]');
    sl.add('OPEN='+app);
    sl.add('ICON='+icon);
    if copy(destfile, length(destfile)-4, 4)<>'.infthen destfile:=destfile+'.inf';
    sl.SaveToFile(destfile);
  finally
    sl.Free; // die Resource wird immer freigegeben, egal was passiert
  end;
EDIT: Wir werden uns das mal merken und machen uns dann über dich lustig... Natürlich auch, wenn du mal vollkommen recht haben solltest! Aber diesmal:
  Mit Zitat antworten Zitat