首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应用程序崩溃后,用于delphi的MadExcept无法打印堆栈跟踪

应用程序崩溃后,用于delphi的MadExcept无法打印堆栈跟踪
EN

Stack Overflow用户
提问于 2013-08-26 12:53:13
回答 2查看 859关注 0票数 1

详细问题:

我们试图在delphi应用程序中使用MadExcept捕获堆栈跟踪(bugreport.txt),在该应用程序中,一个线程使用致命错误使应用程序崩溃。但是在应用程序崩溃后,MadExcept不会打印任何堆栈跟踪。你知道为什么吗?

我们的代码:

代码语言:javascript
复制
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,以便它知道发生了致命错误,并将中止线程。

EN

回答 2

Stack Overflow用户

发布于 2013-08-26 16:07:19

madExcept不处理该异常的原因是,您已经在on E:Exception do自己处理它的时候捕获到了它。只需给madExcept.HandleExcept一个异常来处理它:

代码语言:javascript
复制
madExcept.HandleException(etNormal, E);
票数 8
EN

Stack Overflow用户

发布于 2013-08-26 22:22:24

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

代码语言:javascript
复制
procedure YourHiddenExceptionHandler(const exceptIntf: IMEException; var handled: boolean);
begin
  handled := false;
end;

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18436853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档