![]() |
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. |
AW: Exceptions im Konstruktor auslösen
Du kannst den Konstruktor vor dem inherited Create mit abort abbrechen:
Zitat:
|
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. |
AW: Exceptions im Konstruktor auslösen
Eigentlich sollte man auch diesen debuggen können,
aber mach dir doch einfach mal ein
Delphi-Quellcode:
dort rein.
ShowMessage('...');
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. |
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 06:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz