AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Exceptions im Konstruktor auslösen

Ein Thema von cmrudolph · begonnen am 28. Jul 2010 · letzter Beitrag vom 28. Jul 2010
Antwort Antwort
cmrudolph

Registriert seit: 14. Aug 2006
29 Beiträge
 
Delphi 7 Professional
 
#1

Exceptions im Konstruktor auslösen

  Alt 28. Jul 2010, 10:24
Delphi-Version: 2005
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.
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#2

AW: Exceptions im Konstruktor auslösen

  Alt 28. Jul 2010, 11:02
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.
  Mit Zitat antworten Zitat
cmrudolph

Registriert seit: 14. Aug 2006
29 Beiträge
 
Delphi 7 Professional
 
#3

AW: Exceptions im Konstruktor auslösen

  Alt 28. Jul 2010, 12:05
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.015 Beiträge
 
Delphi 12 Athens
 
#4

AW: Exceptions im Konstruktor auslösen

  Alt 28. Jul 2010, 12:08
Eigentlich sollte man auch diesen debuggen können,
aber mach dir doch einfach mal ein 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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (28. Jul 2010 um 12:19 Uhr)
  Mit Zitat antworten Zitat
cmrudolph

Registriert seit: 14. Aug 2006
29 Beiträge
 
Delphi 7 Professional
 
#5

AW: Exceptions im Konstruktor auslösen

  Alt 28. Jul 2010, 12:24
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:07 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