Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#19

AW: Rewrite(f) findet File nicht...

  Alt 9. Aug 2015, 21:12
Hmmm, ich weiß nicht was da "abschmiert". Im Gegenteil, dein Programm bleibt eher stabil.

Oder wie willst du hier irgendwas in den Stream schreiben, wenn du
  • Keine Instanz übergeben hast
  • Keinen Dateinamen übergeben hast
  • Keine Datei erzeugen konntest
Diese Methode muss einfach abgebrochen werden, weil eine sinnvolle Weiterführung nicht möglich ist.

Delphi-Quellcode:
procedure DoSaveFoo( AFoo: TFoo; AFileName : string );
var
  LFooData: TBytes;
  LStream: TStream;
begin

  // Guard Block - zu 99.9% ein Programmiererfehler, wenn das kommt

  // Kein Foo, dann kann ich nichts machen => tschüssi
  if not Assigned( AFoo ) then
    raise EArgumentNilException.Create('AFoo');
  // Kein Dateiname, dann kann ich nichts machen => tschüssi
  if AFileName.IsEmpty then
    raise EArgumentNilException.Create('AFileName');

  LFooData := SerializeFoo( AFoo );
  LStream := TFileStream.Create( AFileName, fmCreate or fmShareExclusive );
  try
    LStream.WriteData( LFooData, Length( LFooData ) );
  finally
    LStream.Free;
  end;
end;
Aber die Methode vorher, die könnte etwas machen. Wenn es ein Problem mit dem FileStream gab (EFileStreamException = alle Exceptions von TFileStream ohne die normalen Exceptions die TStream wirft), dann wird das 9 mal mit einem neuen Dateinamen versucht. Wenn das nicht funktioniert hat, dann wird diese Exception auch weitergereicht (angezeigt).

Alle anderen Exceptions laufen einfach durch und werden direkt angezeigt.
Delphi-Quellcode:
procedure SaveFoo();
var
  LFoo: TFoo;
  LFooFileName: string;
  LRetry: Integer;
begin
  LFoo := TFoo.Create;
  try

    LRetry := 0;
    while true do
    begin
      LFooFileName := GetTempFileName();
      try
        DoSaveFoo( LFoo, LFooFileName );
        Break;
      except
        on E: EFileStreamError do
        begin
          Inc( LRetry );
          if LRetry = 10 then
            raise;
        end;
      end;
    end;

  finally
    LFoo.Free;
  end;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat