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

djs*_*oft 6 delphi exception

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

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

Dav*_*nan 8

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

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

initialization
  Application.OnException := TMainForm.OnException;
Run Code Online (Sandbox Code Playgroud)

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


Ser*_*yuz 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;
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢!JITEnable := 2 似乎是我正在寻找的。 (3认同)