Ответ J ... и Реми Лебо хорош с тем, что предлагает Delphi, но мне нужно немного больше, и я наконец решил немного изменить модуль System.Classes
var
ApplicationHandleThreadException: procedure (Sender: TObject; E: Exception) of object = nil;
function ThreadProc(const Thread: TThread): Integer;
...
try
Thread.Execute;
except
Thread.FFatalException := AcquireExceptionObject;
if assigned(ApplicationHandleThreadException) and
assigned(Thread.FFatalException) and
(Thread.FFatalException is Exception) and
(not (Thread.FFatalException is EAbort)) then
ApplicationHandleThreadException(Thread, Exception(Thread.FFatalException));
end;
в этомТаким образом, вам просто нужно присвоить ApplicationHandleThreadException
для обработки необработанного повышения исключений в любом TThread.Вам не нужно беспокоиться о многопоточности, потому что глобальные переменные типа ExceptAddr
объявлены как threadvar
, поэтому все работает отлично, даже для получения трассировки стека!
https://quality.embarcadero.com/browse/RSP-21269