2012-03-23 75 views
1

我有一个运行多个线程的应用程序。我使用MadExcept来捕获错误并进行调试。致命应用程序错误未被MadExcept捕获

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

+3

如果错误发生在Delphi的异常逻辑之外,并且在MadExcept可以捕获的事件之外, MadExcept没有什么可以做的。但是,您没有提供关于实际错误的信息(“关闭程序对话框”不起作用)。如果它是我认为的关闭对话框**可能是(但我不确定,因为你没有说出Windows的版本),有一种方法可以查看错误报告和堆栈跟踪,以便查看什么错误实际发生在哪里;虽然我从这里看不到它,所以我不能提供更多的帮助。 :) – 2012-03-23 12:28:52

+0

我正在使用Windows 7没有提供更多的信息提供只是:“程序遇到了错误和Windows ...” – opc0de 2012-03-23 12:32:54

+0

该对话框上有链接查看错误报告,其中显示路径和名称的文本文件,如果您允许它发送错误报告,它将发送给MS。该文本文件内部是调用堆栈和其他信息(例外代码,注册内容,指令指针信息等),可帮助找出问题。 – 2012-03-23 12:36:18

回答

1

线程是一种特殊情况。如果线程中有异常,它将不会被全局处理程序处理,并且通常会终止您的应用程序。 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。这样,我的控制代码就可以看到出错的地方,并且适当地处理它(重新启动它或报告错误等)

+0

@大卫对不起,不要关注?如果你想在没有madExcept的情况下编译,这可以让你这样做。 HandleException是madExcept特定的,所以显然需要忽略,如果你没有它。但这也意味着您可以通过正常的madExcept方式获得异常的踪迹。 – mj2008 2012-03-23 13:58:09

+0

也许这是新的,因为这是Mathias说我应该这样做,当我想抓住异常细节。 – mj2008 2012-03-23 14:05:21