从其他线程捕获未处理的异常

时间:2014-02-04 17:15:57

标签: delphi exception exception-handling ipc madexcept

我正在编写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 个答案:

答案 0 :(得分:0)

虽然我知道MadExcept我没有个人经验,但是在线程中捕获异常的一般方法是在线程的try...except方法中有一个Execute帧。在except...end区块中,您应该可以自己致电Form1.ApplicationEvent1Exception

答案 1 :(得分:0)

我试过了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;