禁用异常处理并让Windows捕获它?

时间:2012-08-26 17:47:38

标签: delphi exception

我想禁用Delphi的异常捕获并让Windows捕获它 - 使它产生一个类似“AppName崩溃。调试,发送”的窗口,将其添加到Application事件,创建内存转储等等。

默认情况下,Delphi捕获TApplication.Run过程中的所有异常...如何在不修改Forms.pas的情况下避免这种情况?

4 个答案:

答案 0 :(得分:8)

您可以添加重新引发异常的OnException处理程序:

class procedure TMainForm.OnException(Sender: TObject; E: Exception);
begin
  raise Exception(AcquireExceptionObject);
end;

initialization
  Application.OnException := TMainForm.OnException;

我不知道你为什么要这样做呢。使用像madExcept或EurekaLog这样的工具来显示错误对话框会产生比系统对话框更有用的信息,这更为正常。

答案 1 :(得分:4)

您可以将JITEnable设置为“1”或更高(默认为“0”)。对于'1',非本机异常,高于'1',所有异常都将由JIT或WER处理(取决于系统)。

这可能不是你想要的。使用此解决方案,任何符合条件的异常都将传递给操作系统,无论是否在代码中处理它们都无关紧要。澄清(在调试器外部运行):

procedure TForm1.Button1Click(Sender: TObject);
begin
  raise EAccessViolation.Create('access denied');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  try
    PInteger(0)^ := 0;
  except
  end;
end;

initialization
  JITEnable := 1;

第一个示例是本机异常,当JITEnable为1时,它将由应用程序异常处理机制处理。但第二个示例将触发JIT / WER。

答案 2 :(得分:3)

添加自己的处理程序。 Application.OnException可能就是你想要的。最好不要把它留给窗户,因为根据环境你会得到不同的行为。例如,如果启用了Windows错误报告,它将询问用户是否要向MS发送错误报告。

像赫弗南先生一样,我建议你看看像EurekaLog这样的东西。

答案 3 :(得分:0)

AS。我同意上面的声音,这个愿望很奇怪。 我也同意在TApplication.OnException中实际挂钩可能就足够了(“如果看起来像鸭子......”)

但是,如果你真的想让RTL无视异常,也有办法。

异常处理程序是低级RTL的插件,就像堆管理一样。

您可以查看KOL(密钥对象库)。 在Delphi 5次中,我设法制作了2KB大小的DLL。

这需要废除许多被认为是“理所当然”的特征。其中有例外。

要在KOL的系统RTL替换中启用异常,您必须制作一些$ DEFINE,然后解锁为IDE添加异常支持的代码。

我相信你仍然可以获得模块化的RTL版本和grep for $ ifDef并查看哪个代码被替换为哪个代码。 我相信你有可能撤消这一点,并让Windows避免在Exceptions上调用Delphi RTL。 我不记得细节,但我相信Delphi RTL异常处理程序只是在Windows核心中注册为回调。你可能可以取消注册它(注册nil回调)。 我相信你可以在RTL中找到它,但KOL的模块化RTL只会让它更容易搜索。