Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Exceptions im Konstruktor auslösen (https://www.delphipraxis.net/153291-exceptions-im-konstruktor-ausloesen.html)

cmrudolph 28. Jul 2010 09:24

Delphi-Version: 2005

Exceptions im Konstruktor auslösen
 
Hi,
ich löse im Konstruktor, wenn gewisse Richtwerte bei den Parametern nicht eingehalten werden, eine Exception aus.
Sollte diese vor oder nach dem inherited Create; ausgelöst werden, oder ist es egal?
Ich habe bei diesem Objekt auch einen Destruktor, der andere im Objekt enthaltene Objekte wieder freigibt, nachdem mit Assigned geprüft wurde, ob diese existieren.

blackfin 28. Jul 2010 10:02

AW: Exceptions im Konstruktor auslösen
 
Du kannst den Konstruktor vor dem inherited Create mit abort abbrechen:
Zitat:

Use Abort in the constructor. It raises a silent exception. If an object has an exception in the constructor, then the destructor is called automatically and the memory released. The advantage of Abort is then you don't need to worry about an exception dialog being displayed if you don't add exception handling code.

cmrudolph 28. Jul 2010 11:05

AW: Exceptions im Konstruktor auslösen
 
Ich habe jetzt noch einen Test mit dem Debugger gemacht. Wie ich es vermutet habe ist es so, dass der Destruktor nicht mehr aufgerufen zu werden scheint, wenn ich vor dem inherited die Exception raise. Eine stille Exception moechte ich nicht verwenden, da der Fall ja vom Programm abgefangen werden soll.

Liege ich mit dem Destruktor richtig, oder liegt das nur am Debugger, dass ich den Destruktor nicht debuggen kann, wenn ich vor dem inherited abbreche?

Danke schonmal fuer die Hilfe.

himitsu 28. Jul 2010 11:08

AW: Exceptions im Konstruktor auslösen
 
Eigentlich sollte man auch diesen debuggen können,
aber mach dir doch einfach mal ein
Delphi-Quellcode:
ShowMessage('...');
dort rein.

also bei mir Ruft der den Destruktor immer auf.
[add]
Code:
*** after inherited ***
MyClass1.Create
MyClass2a.Create
MyClass2a.Destroy
MyClass1.Destroy
*** befor after inherited ***
MyClass2b.Create
MyClass2b.Destroy
MyClass1.Destroy
* end
Delphi-Quellcode:
program Test;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Dialogs;

type
  MyClass1 = class
    constructor Create;
    destructor Destroy; override;
  end;

  MyClass2a = class(MyClass1)
    constructor Create;
    destructor Destroy; override;
  end;

  MyClass2b = class(MyClass1)
    constructor Create;
    destructor Destroy; override;
  end;

constructor MyClass1.Create;
begin
  WriteLn('MyClass1.Create');
end;

destructor MyClass1.Destroy;
begin
  WriteLn('MyClass1.Destroy');
end;

constructor MyClass2a.Create;
begin
  inherited;
  WriteLn('MyClass2a.Create');
  raise Exception.Create('Fehler');
end;

destructor MyClass2a.Destroy;
begin
  WriteLn('MyClass2a.Destroy');
  inherited;
end;

constructor MyClass2b.Create;
begin
  WriteLn('MyClass2b.Create');
  raise Exception.Create('Fehler');
  inherited;
end;

destructor MyClass2b.Destroy;
begin
  WriteLn('MyClass2b.Destroy');
  inherited;
end;

begin
  WriteLn('*** after inherited ***');
  try
    MyClass2a.Create;
  except
  end;

  WriteLn('*** befor after inherited ***');
  try
    MyClass2b.Create;
  except
  end;

  WriteLn('* end');
  ReadLn;
end.

cmrudolph 28. Jul 2010 11:24

AW: Exceptions im Konstruktor auslösen
 
Danke fuer den Super Quelltext. Hatte jetzt nochmal mit MessageBox debugged und festgestellt, dass der Destruktor immer aufgerufen wird. Aber aus deinem Programm wird ersichtlich, dass ich tunlichst als erstes inherited aufrufen sollte, weil sonst der Destruktor von der Parent-Klasse aufgerufen wird, ohne, dass der Konstruktor vorher benutzt wurde.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz