I tried madExcept, which is able to catch exception from different thread. After further digging, I found a way to catch exceptions silently with the help of madExcept.
procedure TForm1.HandleUncaughtException(const ExceptIntf: IMEException; var Handled: Boolean);
begin
SendExceptionToAnotherProcess(ExceptIntf.ExceptMessage);
Handled := True;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
madExcept.RegisterExceptionHandler(HandleUncaughtException, stTrySyncCallAlways, epMainPhase);
end;