Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   AcquireExceptionObject() / ReleaseExceptionObject() (https://www.delphipraxis.net/192895-acquireexceptionobject-releaseexceptionobject.html)

himitsu 1. Jun 2017 13:08

AW: AcquireExceptionObject() / ReleaseExceptionObject()
 
Zitat:

Delphi-Quellcode:
try
  raise EProgrammerNotFound.Create('nope');
except
  AcquireExceptionObject();
  ReleaseExceptionObject(); // << this is an empty procedure
end;

Das ReleaseExceptionObject würde in diesem Code sowieso nie was machen, selbst wenn es was machen würde.

AcquireExceptionObject hängt die Exception von dem Exception-Block ab und gibt sie dir
und ReleaseExceptionObject würde die Exception des Exception-Block freigeben, welche es da aber schon nicht mehr gibt.

rein logisch sind diese beiden Codes identisch
Delphi-Quellcode:
except ReleaseExceptionObject; end;
=
Delphi-Quellcode:
except AcquireExceptionObject.Free; end;

Der schöne Günther 1. Jun 2017 13:31

AW: AcquireExceptionObject() / ReleaseExceptionObject()
 
Das ist ja nur ein Test. Der Klassische Fall das Exception-Objekt außerhalb des try..except-Blocks weiterleben lassen zu wollen ist es bspw. in einem anderen Thread zu verarbeiten (Exception-Logging, ...).

So macht das
Delphi-Quellcode:
TThread
auch damit man nach Thread-Ende noch das Feld
Delphi-Quellcode:
FatalException
auslesen kann.

Und ja, ich weiß dass ich das zurückgegebene TObject / Exception "normal" freigeben kann. Es geht aber darum dass die Doku ein Laufzeitverhalten verspricht das überhaupt nicht existiert. Dass Code existiert der anscheinend überhaupt nicht aktiv ist da er von einer leeren Prozedur verdeckt wird.

himitsu 1. Jun 2017 13:49

AW: AcquireExceptionObject() / ReleaseExceptionObject()
 
Es lassen sich nicht alle Dinge auf allen Platformen gleich umsetzen und das ist eine plaformübergreifende Funktion.

Wenn es in einer Platform kein äquivalentes Verhalten gibt und sich das Standardverhalten nicht extrem wiedersprüchlich verhalten würde, dann macht man dort einfach nichts und schon ist gut. :angle:



Da finde ich es "schwachsinniger", dass .Free unter ARC garnichts macht, obwohl man dort etwas genau jetzt freigeben will.

Stevie 6. Jun 2017 11:52

AW: AcquireExceptionObject() / ReleaseExceptionObject()
 
Die Doku is kompletter Unfug. ReleaseExceptionObject kann gar nicht das machen, was da steht, weil man AcquireExceptionObject so oft und auf so viele Exceptions machen kann, wie man will. Wenn man sie freigeben möchte, reicht ein einfaches Free bzw auf nil setzen der Variable unter ARC (ab Delphi 10.2).

Vorher war die Funktion unter ARC noch verbuggt, da sie einen Pointer zurücklieferte und somit ARC umging (siehe https://quality.embarcadero.com/browse/RSP-13652)

Korrektur: Das mit dem RefCount in ReleaseExceptionObject ist nur unter dem IFDEF PC_MAPPED_EXCEPTIONS und hat mit ARC nix zu tun - guckstu: http://docwiki.embarcadero.com/RADSt...ped_Exceptions


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:31 Uhr.
Seite 2 von 2     12   

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