Hallo allerseits,
ich habe mir schon oft die Frage gestellt, wie man eigentlich korrekterweise mit Exceptions innerhalb von Konstruktoren selbstgeschriebener Klassen umgeht. Als Beispiel habe ich mal ein kleines Mini-Programm entworfen mit einer selbstdefinierten Klasse (von TObject abgeleitet) und einem eigenen Konstruktor, in der nichts weiter gemacht wird, als eine
Exception ausgelöst. Aber schaut es euch selber an:
Delphi-Quellcode:
type
TForm1 =
class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
type
TMyClass =
class(TObject)
private
public
constructor Create(bCreateException: Boolean);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TMyClass }
constructor TMyClass.Create(bCreateException: Boolean);
begin
inherited Create;
if bCreateException
then
raise Exception.Create('
Test');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
MyObject : TMyClass;
begin
try
MyObject := TMyClass.Create(True);
except
if Assigned(MyObject)
then
FreeAndNil(MyObject);
end;
end;
In der ButtonClick-Routine wird ein Objekt der Klasse TMyClass erzeugt, in deren Konstruktor bereits eine
Exception auftritt.
Nun meine Frage: Wird durch das "inherited Create" innerhalb des Konstruktors bereits Speicher allokiert (ja oder?) und wie gebe ich den dann anschließend frei??? Die Funktion "Assigned(MyObject)" liefert True zurück, das FreeAnNil anschließend erzeugt jedoch eine Speicherzugriffsverletzung.
Oder sind Exceptions innerhalb von Konstruktoren so ein typischen Unding, was man nie nie nie nie [...] nie nie niemals bei Delphi machen sollte
?
Vielen Dank im Voraus für die Hilfe!