Application.OnError oder besser TApplicationEvents.OnError,
das fängt alles ab, was in der
VCL-MessageLoop landet. (also kurz bevor die
Exception-Meldung angezeigt wird, welche man darüber z.B. ersetzen kann)
Und natürlich sollte man mal die Exceptions mal auswerten, welche im TThread.Execute durchrauschen,
denn die verschwinden normaler Weise im Nirvana. TThread.OnTerminate und dort das TThread.FatalException (ist eine
Exception) auswerten.
Exceptions im Synchronize werden vom Hauptthread an den aufrufenen Thread durchgereicht und dort erneut ausgelöst.
In
WinAPI-Threads, ohne die
RTL drumrum, auch in HauptThread ohne die
VCL drumrum (drum hat in halbwegs aktuellen Delphis die Konsolenanwendung-Vorlage ein Try-Except schon eingebaut)
Und warum Delphi die Exceptions abfängt:
Windows schießt die komplette Anwendung ohne Fehlemeldung radikal ab, wenn Exceptions unbehandelt bis zum Windows (dahin, wo der Thread gestartet wurde) durchrauschen. (nur ein Logeintrag in der ereignisanzeige)
Oder man wendet sich direkt an die Exceptionbehandlung.
Oder man verwendet ein Exceptionsbehandlungstool (z.B. EurekaLog)
Die übernehmen, wen es eingestellt ist, auch das Loggen des (unbehandelten) Fehler oder gar aller Fehler (auch der via Try-Except abgefangenen) und der kann die Logmeldung auch verschicken (z.B. via eMail)