为什么 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.
问题摘要:分配给 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.