AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Frage zu Try..Finally/Except

Ein Thema von Pseudemys Nelsoni · begonnen am 3. Nov 2003 · letzter Beitrag vom 5. Nov 2003
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#1

Frage zu Try..Finally/Except

  Alt 3. Nov 2003, 04:52
hoi, ich hab ne frage, und zwar:

Delphi-Quellcode:
procedure bla;
var
  i: integer;
  sl: TStringList;
begin
  sl := TStringList.Create;
  with sl do
  begin
    add('A');
    add('B');
    add('C');
  end;
  for i := 0 to 3 do
  begin
    Try
      Try
        idHTTP1.Post('www.bla.de', sl);
      except
        ShowMessage('Can''t connect.');
      end;
    finally
    //jo hier brauch ich garnix O_o
    end;
  end;
  sl.free <<<< wie soll ich die free'en, das finally gilt ja nur innerhalb des innersten blocks?
end;
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Frage zu Try..Finally/Except

  Alt 3. Nov 2003, 06:35
Delphi-Quellcode:
procedure bla;
var
  i: integer;
  sl: TStringList;
begin
  sl := TStringList.Create;
  try ------------------------------
    with sl do |
    begin |
      ...; |
    end; |
    for i := 0 to do |
    begin |
      try ----------------------- |
        idHTTP:Post(...); | |
      except -------------------- |
        ShowMessage('Kuckuck'); | |
      end; ---------------------- |
    end; |
  finally --------------------------
    sl.Free; |
  end; -----------------------------
end;
Nur richtig schachteln.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Frage zu Try..Finally/Except

  Alt 3. Nov 2003, 13:58
Hi,

mal als grundsätzliche Regel folgendes beherzigen

Delphi-Quellcode:
var meineObjektVariable:TTypMeineObjektVariable;

begin

  try

      meineObjektVariable := TTypMeinerObjektVariablen.Create;
      try
         TuWas;
      finally
         meineObjektVariable.Free;
      end;

  except
    AusnahmeBehandeln;
  end;



end;
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#4

Re: Frage zu Try..Finally/Except

  Alt 3. Nov 2003, 14:10
Zitat von Tyrael Y.:
Hi,

mal als grundsätzliche Regel folgendes beherzigen

Delphi-Quellcode:
var meineObjektVariable:TTypMeineObjektVariable;

begin

  try

      meineObjektVariable := TTypMeinerObjektVariablen.Create;
      try
         TuWas;
      finally
         meineObjektVariable.Free;
      end;

  except
    AusnahmeBehandeln;
  end;



end;
Dein Code ist Äquivalent zu
Delphi-Quellcode:
var
  meineObjektVariable:TTypMeineObjektVariable;
begin
  meineObjektVariable := TTypMeinerObjektVariablen.Create;
  try
    try
      TuWas;
    except
      AusnahmeBehandeln;
    end;
  finally
    meineObjektVariable.Free;
  end;
end;
und zu
Delphi-Quellcode:
var
  meineObjektVariable:TTypMeineObjektVariable;
begin
  meineObjektVariable := TTypMeinerObjektVariablen.Create;
  try
    TuWas;
  except
    meineObjektVariable.Free;
    AusnahmeBehandeln;
  end;
end;
(vorausgesetzt, im Destruktor wird keine Exception geworfen).

Warum sollte man das grundsätzlich so machen, wie Du gezeigt hast?
gruß, choose
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Frage zu Try..Finally/Except

  Alt 3. Nov 2003, 14:11
nein ist es nicht,

gib deinen code in delphi rein
und kompiliere es du wirst Hints bekommen
mit meiner version nicht


und die zweite version von dir ist
was völlig anderes da es im except
freigegeben wird

und wenn es keine except gibt, ist das
objekt nicht freigegeben
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Frage zu Try..Finally/Except

  Alt 3. Nov 2003, 14:15
Zitat:
Warum sollte man das grundsätzlich so machen, wie Du gezeigt hast?
weil es die einzig wirklich richtige version ist


innerhalb eines

try.... finally ..end;

blockes kann man natürlcih so viel try ...except .. end; blöcke benutzen wie man möchte,
aber bei jeder Objekterstellung sollte man vorgehen wie ich es beschrieben habe.


mfg

Tyrael
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#7

Re: Frage zu Try..Finally/Except

  Alt 3. Nov 2003, 14:47
Du hast Recht, in der dritten Version wird Free nur im Fall einer Exception aufgerufen, mein Fehler.

Ich konnte die Compilerhinweise leider nicht rekonstruieren: Weder in "Deiner" noch in "meiner" Version treten bei mir Meldungen auf (Ja, die Hints sind aktiviert).

Marcelo beschreibt in seinem BDN-Artikel Exceptional exceptions, Learn about structured exceptions and some unusual ways to use them nicht nur das Verfahren, auf das ich mich berufe sondern zeigt ebenfalls die Besonderheiten der Methode Free auf.

Es ist zu erkennen, das Verschachtelungen in beiden Ausprägungen nicht nur zulässig sondern in einigen Fällen auch zu "eleganterem" Code führen können. Es gibt demnach nicht nur "ein einzig richtiges Vorgehen",beim Erzeugen und Freibegen von Objekten.

Oder vestehe ich hier etwas falsch?
gruß, choose
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Frage zu Try..Finally/Except

  Alt 3. Nov 2003, 15:32
hi,

diese Version von dir ist nicht "vollkommen" falsch.

Delphi-Quellcode:
var
  meineObjektVariable:TTypMeineObjektVariable;
begin
  meineObjektVariable := TTypMeinerObjektVariablen.Create;
  try
    try
      TuWas;
    except
      AusnahmeBehandeln;
    end;
  finally
    meineObjektVariable.Free;
  end;
end;
aber was ist wenn
meineObjektVariable := TTypMeinerObjektVariablen.Create; NICHT geklappt hat??
Dann entsteht bei dir ne Ausnahme.

Also benutz es lieber wie ich es beschrieben habe.
Dann kann nix schiefgehen


mfg

Tyrael
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Frage zu Try..Finally/Except

  Alt 3. Nov 2003, 15:43
ich muss dir widersprechen, sry


Zitat:
Es gibt demnach nicht nur "ein einzig richtiges Vorgehen",beim Erzeugen und Freibegen von Objekten.
es gibt nur EINE vernünftige Version,wenn du alles beachten möchtest


also nochmal

Delphi-Quellcode:

 try
   Objekt erzeugen
   try
        .....
           Hier darf alles stehen
           z.B auch andere try finally
           und try except blöcke
        .....
   finally
      Objekt freigeben
   end;
 except
   Ausnahme bei Objekterzeugung behandeln
 end;
alles andere ist auch gut und schön, aber nicht 100% wasserdicht


NUR diese Version ist richtig.
Wer was anderes behauptet, sollte noch bissel programmieren und
wird bald,wenn er mal was komplexeres macht, nebeneffekte haben,
die er lange suchen kann.

mfg
Tyrael
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#10

Re: Frage zu Try..Finally/Except

  Alt 3. Nov 2003, 16:01
Zunächst, Dein erstes Posting: Wenn der Aufruf von TTypMeinerObjektVariablen.Create; fehlschlägt, wird implizit der Destruktor für dieses Exemplar aufgerufen.

Der Code
Delphi-Quellcode:
try
  myVar:= TMyClass.Create;
finally
  myVar.Free;
end;
kann daher bei lokalen Variablen zu fehlern führen, weil myVar bei einer Exception im Konstruktor nie beschrieben wird und die Nachricht Free deshalb an eine nicht-initialisierte Referenz geschickt (die Methode aufgerufen) wird.

Reicht der implizite Aufruf des Destruktors nicht aus? Warum möchtest Du den Fall, dass der Constructor eine Exception wirft, abfangen? Wie willst Du reagieren, wenn der Destruktor, zB wg nur teilweise erzeugten aggregierten Objekten, seinerseits beim impliziten Aufruf eine Exception wirft? Mit dem Code
Delphi-Quellcode:
type
  TMyClass = class
  public
    constructor Create;
    destructor Destroy;override;
  end;

constructor TMyClass.Create;
begin
  inherited Create;
  raise Exception.Create('exception within a constructor');
end;

destructor TMyClass.Destroy;
begin
  raise Exception.Create('exception within a destructor');
  inherited;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  myVar: TMyClass;
begin
  myVar:= TMyClass($badf00d); //stack contains rubbish
  try
    myVar:= TMyClass.Create;
    try
    finally
      myVar.Free;
    end;
  except
    on E:Exception do
      outputDebugString(PChar('Exception:'+E.Message));
  end;
end;
kannst Du diesen Fall gut simulieren und erkennen, dass die ursprüngliche Exception "verschluckt" wird.

Mit GetHeapStatus.TotalAllocated kannst Du Dich vergewissern, dass in diesem trivialen Bsp der gesamt Speicher durch den impliziten Aufruf freigegeben wird.

Trotzdem: Durch ein simples Abfangen einer Exception, die vom Konstruktor geworfen wird, ist Dir bei aggregierten Objekten nicht geholfen, wenn der Destruktor mit einer Exception, die vom Konstruktor geworfen wird, nicht umgehen kann.
gruß, choose
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 02:46 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