Delphi MadExcept未捕获致命的应用程序错误

Delphi MadExcept未捕获致命的应用程序错误,delphi,error-handling,Delphi,Error Handling,我有一个运行多线程的应用程序。我使用MadExcept捕捉错误并调试它 问题是,有时在运行2-3小时后,Windows会显示关闭程序对话框。为什么MadExcept不能处理该错误?线程是一种特殊情况。如果线程中有异常,它将不会被全局处理程序处理,并且通常会终止应用程序。不过,解决方法很简单,只需使用madExcept即可。只要抓住异常,告诉MadExcept它就行了。它将以通常的方式登录,并且您不会终止线程 uses {$IFDEF MadExcept} madExcept, {$ENDIF

我有一个运行多线程的应用程序。我使用MadExcept捕捉错误并调试它


问题是,有时在运行2-3小时后,Windows会显示关闭程序对话框。为什么MadExcept不能处理该错误?

线程是一种特殊情况。如果线程中有异常,它将不会被全局处理程序处理,并且通常会终止应用程序。不过,解决方法很简单,只需使用madExcept即可。只要抓住异常,告诉MadExcept它就行了。它将以通常的方式登录,并且您不会终止线程

uses 
{$IFDEF MadExcept}
 madExcept,
{$ENDIF}


procedure TMyThread.Execute;
begin
  try
      SetName;
    // do your stuff

  except
    on errInfo : Exception do
    begin
{$IFDEF MadExcept}
      HandleException(etNormal, errInfo);
{$ENDIF}
    end;
  end;
end;

我还要做的是让线程在启动时将“RunningOK”属性设置为true,而异常将其设置为False。通过这种方式,我的控制代码可以看到出现了问题,并适当地处理(重新启动它或报告错误等)

线程是一种特殊情况。如果线程中有异常,它将不会被全局处理程序处理,并且通常会终止应用程序。不过,解决方法很简单,只需使用madExcept即可。只要抓住异常,告诉MadExcept它就行了。它将以通常的方式登录,并且您不会终止线程

uses 
{$IFDEF MadExcept}
 madExcept,
{$ENDIF}


procedure TMyThread.Execute;
begin
  try
      SetName;
    // do your stuff

  except
    on errInfo : Exception do
    begin
{$IFDEF MadExcept}
      HandleException(etNormal, errInfo);
{$ENDIF}
    end;
  end;
end;

我还要做的是让线程在启动时将“RunningOK”属性设置为true,而异常将其设置为False。通过这种方式,我的控制代码可以看到出现了错误,并进行适当的处理(重新启动它或报告错误等)

如果错误发生在Delphi的异常逻辑之外,并且在MadExcept可以捕获的事情之外,MadExcept无能为力。但是,您没有给出有关实际错误的信息(“关闭程序对话框”没有帮助)。如果是关闭对话框,我想可能是(但我不确定,因为您也没有说明Windows的版本),有一种方法可以查看错误报告和堆栈跟踪,您可以使用它来查看实际发生的错误和位置;不过,我从这里看不到,所以我帮不了多少忙我使用的是Windows 7,没有提供更多信息,只是“程序遇到错误,Windows…”对话框上有查看错误报告的链接,其中显示了文本文件的路径和名称,如果允许MS发送错误报告,将发送给MS。在该文本文件中是调用堆栈和其他信息(异常代码、寄存器内容、指令指针信息等),可以帮助解决问题。如果错误发生在Delphi的异常逻辑之外,并且在MadExcept可以捕获的内容之外,则MadExcept无能为力。但是,您没有给出有关实际错误的信息(“关闭程序对话框”没有帮助)。如果是关闭对话框,我想可能是(但我不确定,因为您也没有说明Windows的版本),有一种方法可以查看错误报告和堆栈跟踪,您可以使用它来查看实际发生的错误和位置;不过,我从这里看不到,所以我帮不了多少忙我使用的是Windows 7,没有提供更多信息,只是“程序遇到错误,Windows…”对话框上有查看错误报告的链接,其中显示了文本文件的路径和名称,如果允许MS发送错误报告,将发送给MS。在该文本文件中有调用堆栈和其他信息(异常代码、寄存器内容、指令指针信息等),可以帮助您解决问题。@David抱歉,您不明白吗?如果您想编译而不使用madeexcept,这允许您这样做。HandleException是madespecific,因此如果没有它,显然需要忽略它。但这也意味着你可以通过正常的方式获得异常的踪迹。也许这是新的,因为这就是Mathias说的,当我想要获取异常细节时,我应该这样做。@David抱歉,不明白吗?如果您想编译而不使用madeexcept,这允许您这样做。HandleException是madespecific,因此如果没有它,显然需要忽略它。但这也意味着你可以用正常的方式得到异常的踪迹。也许这是新的,因为这就是Mathias说的,当我想要获取异常细节时,我应该这样做。