1

我正在使用 Delphi 7 并试图处理在程序运行期间抛出的所有可能的异常。我使用 Application.OnException := HandlerProcedure; 处理异常,但是当异常发生时, HandlerProcedure 永远不会被调用。为了确保它是否真的有效,我在分配 Application.OnException 后引发了异常,如下所示:

Application.OnException := HandlerProcedure;
raise Exception.Create('Exception');

并将 HandlerProcedure 定义为:

procedure TFormMain.HandlerProcedure(Sender: TObject; E: Exception);
begin
    ShowMessage('Exception.');      
    Exit;
end;

但是 HandlerProcedure 永远不会被调用。我怎样才能让它处理所有的异常?

4

3 回答 3

13

如果要拦截所有异常,则需要实现一个RTLUnwindProc低级过程。

这有点低级(例如,它需要 asm 技能),因此您应该更好地依赖现有代码。请参阅此堆栈溢出问题我什至在我自己的答案中放了一些参考代码(包括低级 asm,使用 Delphi 7 及更高版本在 Win32 下)。

于 2013-08-29T11:33:54.647 回答
3

你的代码有问题。Embarcadero 网站上的示例运行良好。

{
In addition to displaying the exception message, which 
happens by default, the following code shuts down the 
application when an exception is not caught and handled.  
AppException should be declared a method of TForm1.
}
procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnException := AppException;
end;

procedure TForm1.AppException(Sender: TObject; E: Exception);
begin
  Application.ShowException(E);
  Application.Terminate;
end; 

procedure TForm1.Button1Click(Sender: TObject);
begin
  raise EPasswordInvalid.Create('Incorrect password entered');
end;

此处还介绍了在 Delphi 上处理错误的良好做法。为了进一步调查您遇到的问题,您应该看看这个https://stackoverflow.com/questions/1259563/good-os-delphi-exception-handling-libraries

于 2013-08-29T12:29:03.263 回答
0

如果您使用第三方异常处理程序,例如 madExcept,Application.OnException 将不再触发。您必须改为编码 TMadExceptionHandler.OnException 事件或直接调用 RegisterExceptionHandler。

于 2015-09-16T19:16:29.647 回答