Synchronize und Co. kopieren die
Exception und lösen sie im aufrufenden Thread neu aus.
TThread.Execute tut das nicht. Dort ist man selbst verplichtet in OnTerminate, DoTerminate oder nach Beendigung des Threads das Property FatalException zu prüfen.
Hatte das mal bei Borland/Codegear reportet, aber sie hatten wohl keine Lust diese Funktionialität direkt einzubauen (abschaltbar), so daß es keiner vergessen kann.
Kann sein, daß es "früher", in uralten Delphis, nur innerhalb OnTerminate/DoTerminate auslesbar/verwendbar war und danach die
Exception sofort freigegeben wurde.
In neueren Delphis wird die
Exception via
AcquireExceptionObject abgetrennt und bis zum Free ausgehoben.