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;