Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Try Except und Re raise geht nicht (https://www.delphipraxis.net/137463-try-except-und-re-raise-geht-nicht.html)

QuickAndDirty 21. Jul 2009 13:26


Try Except und Re raise geht nicht
 
Hallo ,
ich hatte einen so ähnlichen Thread schon mal in dem ich festgestellt habe das
eine Unit in Delphi 7
welche einen try except Block im Initialization und im Finalization Teil hat
in einem Package eingebunden dazu führt das es sich nicht INSTALLIEREN lässt.

Warum? Kkann ich da was anderes machen als die try excepts zu entfernen?

Mein neustes nicht installierbares Beispiel sieht so aus.
Delphi-Quellcode:
initialization
  try
    Session := TVSession.Create(nil);
  except
    On E:Exception do
      Raise Exception.create('Error in DBDLL_Fn.initialization: '+e.message);
  end;

Finalization
  try
    Session.Free;
    Session := nil;
  except
    On E:Exception do
      Raise Exception.create('Error in DBDLL_Fn.finalization: '+e.message);
  end;
end.


So gehts
Delphi-Quellcode:
initialization
//  try
    Session := TVSession.Create(nil);
(*  except
    On E:Exception do
      Raise Exception.create('Error in DBDLL_Fn.initialization: '+e.message);
  end;*)

Finalization
//  try
    Session.Free;
    Session := nil;
(*  except
    On E:Exception do
      Raise Exception.create('Error in DBDLL_Fn.finalization: '+e.message);
  end;*)
end.

Gruber_Hans_12345 21. Jul 2009 13:36

Re: Try Except und Re raise geht nicht
 
geht das nicht auch so?

ohne zu testen und ohne zu wissen obs besser wäre ;)

Delphi-Quellcode:
initialization
  try
    Session := TVSession.Create(nil);
  except
    On E:Exception do begin
      e.Message := 'Error in DBDLL_Fn.initialization: '+e.message;
      raise;
    end;
  end;
end.

shmia 21. Jul 2009 13:56

Re: Try Except und Re raise geht nicht
 
Im Abschnitt initialization ist kein Exceptionhandling möglich, weil das Exceptionsystem zu diesem frühen Zeitpunkt
noch nicht in Betrieb ist!!
Es erscheint dann nur der Runtime Error 217.

Im Abschnitt finalization ist Exceptionhandling sinnlos, da das Programm sowieso gleich zu Ende ist und ausserdem das Exceptionsystem nicht mehr in Betrieb ist!!

==> Code in initalization & finalization muss so geschrieben sein, dass garantiert keine Exception auftreten kann
oder es muss jede Exception abgefangen und behandelt werden.

himitsu 21. Jul 2009 14:06

Re: Try Except und Re raise geht nicht
 
@shmia:
Wenn die SysUtils-Unit im Interface-Abschnitt der entsprechenden Unit eingebunden ist,
dann sollte auch die Exceptionbehandlung funktionieren (tut sie zumindestens bei mit immer),
Denn Exceptionbehandlung wird über im Initialization- bzw. Finalization-Abschnitt der SysUtils eingerichtet und freigegeben.
Und wenn diese SysUtils-Unit im Interface eingebunden ist, dann wird deren Initialization vor der "eigenen" Initialization ausgeführt und die Finalization umgekehrt.

@Gruber_Hans_12345: Vorteil wäre, daß die Exceptionklasse erhalten bleibt und man so den Fehler nicht "verwässert".
Also z.B. aus einer EOutOfMemory 'ne billige Exception macht, welches dann umgebende Try-Except's nicht mehr unterscheiden können.

QuickAndDirty 21. Jul 2009 14:22

Re: Try Except und Re raise geht nicht
 
SysUtils wird als letzte Klasse im interface teil eingebunden.

Und der Code selbst arbeitet auch. Kompilierbar, benutzbar, nur leider nicht als Package installierbar :-(

HM seltsam das. Und das obwohl eine Exception gar nicht ausgelöst wird.
Ich weiß nur das Beim Installieren Initialization auf Jedenfall ausgeführt wird...aber wie soll ein programmierer einen Code
so schreiben das er garantiert keine Fehler enthält? Und wenn einer drinn ist wie bekomme ich den Ort dann raus, wenn re-raise nicht erlaubt ist?

QuickAndDirty 21. Jul 2009 14:44

Re: Try Except und Re raise geht nicht
 
Hab jetzt alles ausser der einer Globalen Variable vom typ Tstringlist auskommentiert
und nur diese erzeugt und die unit in einer anderen unit im interface teil verwendet welche in einem
minalmal package (TEdit Descendent mit nur einer zusätzlichen public Varibale) benutzt wird........
.....Installation geht nicht.

Ich hasse das.

Kann mal jemand anders das ganze nachvollziehen oder habe nur ich das hier in D7?

Blup 21. Jul 2009 15:43

Re: Try Except und Re raise geht nicht
 
Zitat:

Zitat von QuickAndDirty
Und der Code selbst arbeitet auch. Kompilierbar, benutzbar, nur leider nicht als Package installierbar :-(

HM seltsam das. Und das obwohl eine Exception gar nicht ausgelöst wird.

Woher willst du wissen das die Exception nicht ausgelöst wird?
Möglicherweise wird die insbesondere gerade bei Installation ausgelöst.
Entferne zum Test mal das "TVSession.Create".

QuickAndDirty 21. Jul 2009 15:48

Re: Try Except und Re raise geht nicht
 
Habe ich doch bereits
ersetzt. Das Problem ist anscheinened das try except

hast du das mal versucht nachzuvollziehen?

himitsu 21. Jul 2009 15:59

Re: Try Except und Re raise geht nicht
 
Wie gesagt:
ich hab zwar grad nur D2009 und D2006 hier drauf,
aber seitem ich Try-Except nutze (also schon ein paar Jährchen), hatte ich auch in D7 noch keine derarigen Probleme.

Krampus 7. Nov 2012 10:16

AW: Try Except und Re raise geht nicht
 
Hallo Leute,

Habe exakt dasselbe Verhalten bei meinem D7 Ent (en).

try except geht zwar Grundsätzlich in finalization, aber
sobald versucht wird 'E.Message' zu verwenden, kracht die Package-Compilierung
(Build geht komischerweise) und das Package liefert bei jedem IDE-Beenden
einen Haufen Access-Violations.

GEHT : on e: Raise Exception.create('Error blabla!');
NICHT: on e: Raise Exception.create('Error blabla: ' + e.message);

Enfernt man das E.Message gibts keine Probleme :shock:
Wieso? keine Ahnung!


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