Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi exception handling im konstruktor (https://www.delphipraxis.net/86989-exception-handling-im-konstruktor.html)

Konse 21. Feb 2007 20:41


exception handling im konstruktor
 
Hi,
wie würdet ihr am besten eine Exception im construktor handlen?

Delphi-Quellcode:
class TCMyClass
private
mInt:Integer;
public
constructor create(const myInt:integer);
end;

constructor TCMyClass.create(const myInt:integer);
begin
if not inRange(myInt, 5,19) then raise Exception.create('value is not in Range..');
mInt:=myInt;
end;
Bis jetzt sehe ich nur folgende möglichkeit:

Delphi-Quellcode:
function doSomething(const toCheck:integer):boolean;
var
lala:TCMyClass;// toCheck ist z.b. integer der nur von 5-19 gehen soll ansonsten exception
begin
  result:=false;

   try
      lala:=TCMyClass.Create(toCheck);
   except
      lala:=nil;
      exit;
   end;

   try
      lala.doWork();
   finally
     FreeAndNil(lala);
   end;
end;
Falls es elegantere Möglichkeiten gibt Preconditions im Konstruktor abzudecken würde
ich mich freuen welche zu sehen ;-)

gruß konse

jbg 21. Feb 2007 21:18

Re: exception handling im konstruktor
 
Zitat:

Zitat von Konse
wie würdet ihr am besten eine Exception im construktor handlen?

Was gibt es da zu behandeln. Wenn im Konstruktor eine Exception auftritt wird sofort in the Destruktor gesprungen und das Objekt freigegeben. Danach wird die Exception weitergeleitet so dass der Konstruktor-Aufrufer diese auch mitbekommt. Zugegeben, die Klasse wird erstmal instanziert und dann wieder freigegeben. Aber im Fehlerfall ist die dabei verschwendete Zeit im Vergleich zum Auslösen einer Exception nicht messbar.

Delphi-Quellcode:
function doSomething(const toCheck:integer):boolean;
var
lala:TCMyClass;// toCheck ist z.b. integer der nur von 5-19 gehen soll ansonsten exception
begin
  result:=false;

   try
      lala:=TCMyClass.Create(toCheck);
   except
      lala:=nil; { *** Das ist nutzlos, da du auf lala nicht mehr zugreifst und es seinen Sichtbarkeitsbereich verlässt }
      exit;
   end;

   try
      lala.doWork();
   finally
     FreeAndNil(lala);
   end;
end;

Konse 21. Feb 2007 21:30

Re: exception handling im konstruktor
 
Zitat:

Was gibt es da zu behandeln. Wenn im Konstruktor eine Exception auftritt wird sofort in the Destruktor gesprungen und das Objekt freigegeben. Danach wird die Exception weitergeleitet so dass der Konstruktor-Aufrufer diese auch mitbekommt. Zugegeben, die Klasse wird erstmal instanziert und dann wieder freigegeben. Aber im Fehlerfall ist die dabei verschwendete Zeit im Vergleich zum Auslösen einer Exception nicht messbar.
zu behandeln gibts im generellen fall dass das objekt nicht instanziiert ist und man auf unreferenzierten speicher zugreift. Es gibt generell Konstruktoraufrufe wo keine exceptions
passieren müssen und wo man im generellen nicht etwaitige exceptions catchen muss.
Mir geht es hier vielmehr um den stil und um robusten, tranzparenten source.






In diesem vereinfachtem beispiel ja, aus gewohnheit setze ich es jedoch immer auf nil,
damit sowas wie assign beim weiteren verarbeiten greift.
Code:
 try
      lala:=TCMyClass.Create(toCheck);
   except
      lala:=nil; { *** Das ist nutzlos, da du auf lala nicht mehr zugreifst und es seinen Sichtbarkeitsbereich verlässt }
      exit;
   end;

Kritik ist immer erwünscht ;-)

Beste grüße
Konse


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:36 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