2

我需要在 Delphi 7 程序中捕获所有非单元初始化异常,以便将异常写入文件,并可能向用户显示消息。

阅读此内容后,我认为全局异常处理程序会很麻烦,而我所需要的只是在 DPR 级别捕获所有异常。但是,我无法获得下面的代码来访问 dpr 中的 ShowMessage。

为什么下面的 Raise Exception 实际上会导致屏幕上显示异常而不是跳出到 .dpr 的 except 子句?也许全局异常处理程序会是更好的方法?

dpr 中下面的代码不应该捕获表单中的所有异常吗?

在 DPR:

begin
  Application.Initialize;
  try
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  except
    On E: Exception do
      ShowMessage('In dpr except. Exception is: ' + E.Message);
  end;    
end.

通知:

Function TForm1.DoSomething( out aErrm: String):boolean; // force a failure for testing
begin
  Result := FALSE;
  aErrm := 'Failed in DoSomething';
end;

procedure TForm1.FormShow(Sender: TObject); 
begin
  try
    fOk := DoSomething(fErrm);
  except
    fOk := FALSE;
    Errm := 'Unexpected exception'
  end;

  if (NOT fOk) then
    Raise Exception.Create(Errm) // why does this pop-up an exception when the DPR has an except around this code?
  else
    PostMessage(Handle, WM_CLOSE, 0, 0); // self-closing form
end;  { FormActivate }
4

1 回答 1

12

TApplication.Run中的主消息循环包装并处理异常块中的所有消息,结果捕获所有异常,从而使 DPR 中的主要异常块完全无用。

如果要捕获和处理应用程序异常,请使用TApplication.OnException

于 2013-05-26T00:36:09.203 回答