MadExcept for delphi在应用程序崩溃后不打印stacktrace

时间:2013-08-26 04:53:13

标签: delphi madexcept

详细问题:

我们正试图在delphi应用程序中使用MadExcept捕获stacktrace(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,以便它知道发生致命错误并将中止该线程。

2 个答案:

答案 0 :(得分:8)

madExcept没有处理异常的原因是因为你已经用on E:Exception do自己处理了它。只需给出madExcept.Handle除了处理它的异常:

madExcept.HandleException(etNormal, E);

答案 1 :(得分:0)

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

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

以上是强制makexcept同时处理异常处理的技巧,当然在生产中使用它是冒险的......