Поймать необработанные исключения из другого потока

Я пишу приложение IPC. Я хочу перехватывать исключения из процесса B без вывода сообщений, а затем отправлять подробности об исключениях в виде строки в процесс A. Я могу перехватывать исключения из основного потока, но возникают проблемы с перехватом исключений из другого потока.

procedure TForm1.ApplicationEvents1Exception(Sender: TObject; E: Exception);
begin
  SendExceptionToAnotherProcess(E.ToString);
end;

type
  AThread = class(TThread)
  protected
    procedure Execute; override;
  end;

procedure AThread.Execute; // Main thread cannot catch such runtime exception
var  uq1, uq2: UInt64;
     s1:       Single;
     d1:       Double;
begin
  uq1 := $9000000000000000;
  s1 := uq1;   // no problem here
  // exception class $C0000090 with message 'c0000090 FLOAT_INVALID_OPERATION'.
  uq2 := round(s1);   // but back-conversion crashes
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  T: AThread;
begin
  T := AThread.Create(True);
  T.Start;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  raise Exception.Create('I can catch it'); 
end;

Есть ли способ отловить исключения из всех потоков? Исключение может быть вызвано третьей библиотекой или элементом управления ActiveX в разных потоках.

2 ответа

Решение

Я попытался madExcept, который может поймать исключение из другого потока. После дальнейшего поиска я нашел способ тихо ловить исключения с помощью 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;

Хотя я знаю о MadExcept, у меня нет личного опыта с ним, но общий подход к отлову исключений в потоках - это иметь try...except кадр в потоке Execute метод. в except...end заблокировать вы должны быть в состоянии позвонить Form1.ApplicationEvent1Exception сам.

Другие вопросы по тегам