Application.OnException无法处理所有异常 - Delphi

时间:2013-08-29 11:02:42

标签: delphi delphi-7

我正在使用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从未被调用过。如何处理所有异常?

3 个答案:

答案 0 :(得分:12)

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

这有点低级(例如它需要asm技能),因此您最好依赖现有代码。见this stack overflow question。我甚至在my own answer中添加了一些参考代码(包括低级asm,在Win32下使用Delphi 7和更高版本)。

答案 1 :(得分:2)

您的代码出了问题。来自Embarcadero网站的example工作正常。

{
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上处理错误的良好实践here。 为了进一步调查您遇到的问题,您应该查看此https://stackoverflow.com/questions/1259563/good-os-delphi-exception-handling-libraries

答案 2 :(得分:0)

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