1

详细问题:

我们正在尝试在 delphi 应用程序中使用 MadExcept 捕获堆栈跟踪 (bugreport.txt),其中一个线程因致命错误而导致应用程序崩溃。但是 MadExcept 在应用程序崩溃后不会打印任何堆栈跟踪。任何想法为什么?

我们的代码:

procedure TMainForm.WSServerExecute(AContext: TIdContext);
begin
  try
    HTMLExecute(AContext);
  except
    on E: Exception do
    begin
      if not(E is EIdException) then
      begin
        LogData.AddError('HTMLExecute error: ' + E.Message);
        madExcept.HandleException;
      end;
      raise;
    end;
  end;
end;

当客户端与服务器建立 websocket 连接时,将调用此过程。这是由 Indy TCPServer 组件生成的线程。HTMLExecute 函数用于在客户端和服务器之间读取和写入数据包。我已经将它包装在 try..except 块中以捕获任何异常。LogData 行将错误记录到错误日志中,madExcept 行应该创建 bugreport.txt 文件。Raise 行将异常传递回 Indy,以便它知道发生了致命错误并中止线程。

4

2 回答 2

8

madExcept 不处理异常的原因是您已经通过on E:Exception do自己的处理捕获了它。只需给 madExcept.HandleExcept 异常处理即可:

madExcept.HandleException(etNormal, E);
于 2013-08-26T08:07:18.753 回答
0

您可以尝试使用RegisterHiddenExceptionHandler(stDontDync). 有关更多详细信息,请参阅文档。在您的处理程序中,只需执行以下操作:

procedure YourHiddenExceptionHandler(const exceptIntf: IMEException; var handled: boolean);
begin
  handled := false;
end;

以上是强制 madexcept 处理异常的技巧,当然在生产中使用它是有风险的......

于 2013-08-26T14:22:24.193 回答