AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language AcquireExceptionObject() / ReleaseExceptionObject()
Thema durchsuchen
Ansicht
Themen-Optionen

AcquireExceptionObject() / ReleaseExceptionObject()

Ein Thema von Der schöne Günther · begonnen am 31. Mai 2017 · letzter Beitrag vom 6. Jun 2017
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.114 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AcquireExceptionObject() / ReleaseExceptionObject()

  Alt 31. Mai 2017, 08:07
Delphi-Version: 10 Seattle
Ich bin jetzt ein bisschen baff

Wenn ich möchte dass eine Exception über ihren try..except -Block hinaus lebt gibt es zwei Routinen AcquireExceptionObject() und ReleaseExceptionObject().

Schaut man in den interface-Teil von System.pas:
Zitat:
{
When an exception is thrown, the exception object that is thrown is destroyed
automatically when the except clause which handles the exception is exited.
There are some cases in which an application may wish to acquire the thrown
object and keep it alive after the except clause is exited. For this purpose,
we have added the AcquireExceptionObject and ReleaseExceptionObject functions.
These functions maintain a reference count on the most current exception object,
allowing applications to legitimately obtain references. If the reference count
for an exception that is being thrown is positive when the except clause is exited,
then the thrown object is not destroyed by the RTL, but assumed to be in control
of the application. It is then the application's responsibility to destroy the
thrown object. If the reference count is zero, then the RTL will destroy the
thrown object when the except clause is exited.
}
function AcquireExceptionObject: Pointer;
procedure ReleaseExceptionObject;

Schaut man in den implementation-Teil dann gibt es ReleaseExceptionObject() zwei mal:

Delphi-Quellcode:
procedure ReleaseExceptionObject;
begin
end;
und
Delphi-Quellcode:
procedure ReleaseExceptionObject;
asm
{$IFDEF ALIGN_STACK}
        SUB ESP, 12
{$ENDIF ALIGN_STACK}
        CALL CurrentException
{$IFDEF ALIGN_STACK}
        ADD ESP, 12
{$ENDIF ALIGN_STACK}
        OR EAX, EAX
        JE @@Error
        CMP [EAX].TRaisedException.RefCount, 0
        JE @@Error
        DEC [EAX].TRaisedException.RefCount
        RET
@@Error:
{ This happens if there is no exception pending, or
  if the reference count on a pending exception is
  zero. }

        JMP _Run0Error
end;
Aufgerufen wird natürlich ersteres. Heißt: Nichts passiert, die Exception verbleibt auf ewig im Speicher.

Kann mir jemand den Sinn dahinter erklären? wtf...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: AcquireExceptionObject() / ReleaseExceptionObject()

  Alt 31. Mai 2017, 08:52
Es gibt normal auch keine Referenzzählung (ARC), also was soll es da machen?
ReleaseExceptionObject ist doch eh nur dazu da, um das Exceptionobjekt vor dem except-end freigeben zu wollen. Gibt doch kaum Gründe, wozu man das unbedingt braucht.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.114 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: AcquireExceptionObject() / ReleaseExceptionObject()

  Alt 31. Mai 2017, 09:02
Da ich nicht riechen kann was intern im Programm abläuft, wie es Resourcen in einem try..except-Block verwaltet kann ich nur auf was vertrauen was in der Doku geschrieben steht und evtl. noch was im RTL-Quelltext für mich sichtbar ist.

Gründe eine Exception länger leben zu lassen kann ich haben, finde ich.

Und für mich sieht es momentan völlig falsch aus - Warum sollte man die Methode mit einem leeren Gegenstück doppeln? Ist das in neueren Delphi-Versionen immer noch so?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: AcquireExceptionObject() / ReleaseExceptionObject()

  Alt 31. Mai 2017, 10:08
Gründe eine Exception länger leben zu lassen kann ich haben, finde ich.
Das schon und AcquireExceptionObject funktioniert ja auch (jedenfalls in meinen Programmen)
und wenn ReleaseExceptionObject nichts macht, dann lebt die Exception-Instanz halt noch ein kleines bissl länger, als gewollt. (bis zum END vom Except)

Ist das in neueren Delphi-Versionen immer noch so?
Ach, an so altem Zeug ändert sich doch fast nie was. (wird immer nur Neues eingeaut und die alten Bugs behalten )

Jupp, ist noch so.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.114 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: AcquireExceptionObject() / ReleaseExceptionObject()

  Alt 31. Mai 2017, 14:34
und wenn ReleaseExceptionObject nichts macht, dann lebt die Exception-Instanz halt noch ein kleines bissl länger, als gewollt. (bis zum END vom Except)
Nein, sie lebt bis zum Tag des Jüngsten Gerichts. Und der Tag kommt an dem Punkt an dem der Anwendung der Speicher ausgeht, deshalb ist es mir erst aufgefallen. Denn normalerweise vertraue ich bei einem mehrere tausend Euro teuren Produkt darauf dass zumindest die Basics funktionieren.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: AcquireExceptionObject() / ReleaseExceptionObject()

  Alt 31. Mai 2017, 15:13
Hier werden ständig so viele Exceptions ausgelöst,
wenn die nicht freigegeben würden (im END), dann würde bei uns doch auch ständig der Speicher ausgehn.

Aktuell noch Delphi XE, aber hier sieht der Code gleich aus.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:27 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