为什么 Application.OnException 从不运行?

Why Application.OnException never runs?

问题摘要:分配给 Application.OnException 的方法在发生未处理的异常时从不 运行s。

我创建了一个只有这个单元的空白项目,并在 Unit.dfm 上放置了一个按钮(这是基于 official example):

// Unit1.pas
// *********

type
TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure AppException(Sender: TObject; E: Exception);
    procedure Button1Click(Sender: TObject);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
    Application.OnException := AppException;
end;

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

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

然后我在TForm1.AppException()里面设置了一个断点。我 运行 程序,单击按钮,显示一个错误对话框说 "Incorrect password entered" 但如果我继续执行断点永远不会中断;该程序也不像我问的那样Terminate。程序继续 运行ning,我可以再次按下按钮。

我在 Delphi 7 中尝试了相同的代码(改编),但遇到了相同的结果。

唯一合理的解释是 FormCreate 没有执行。您需要将其分配给表单的 OnCreate 事件处理程序。使用对象检查器来这样做。

如果您使用第三方异常处理程序,例如 madExcept,Application.OnException 将不再触发。相反,您必须听从第三方的建议。对于 madExcept,您必须编写 TMadExceptionHandler.OnException 事件或直接调用 RegisterExceptionHandler.