问题摘要:当发生未处理的异常时,分配给Application.OnException
的方法永远不会运行。
我创建了一个仅包含此单元的空白项目,并在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()
内设置断点。我运行程序,单击按钮,显示错误对话框,说“输入的密码不正确”,但如果我继续执行,断点永远不会中断;该程序不像Terminate
那样问我。程序继续运行,我可以再次按下按钮。
我在Delphi 7中尝试了相同的代码(改编)但遇到了相同的结果。
答案 0 :(得分:2)
唯一合理的解释是FormCreate
没有执行。您需要将其分配给表单的OnCreate
事件处理程序。使用对象检查器执行此操作。
答案 1 :(得分:1)
如果您使用的是第三方异常处理程序(如madExcept),Application.OnException将不再触发。您必须遵循第三方的建议。对于madExcept,您必须编写TMadExceptionHandler.OnException事件或直接调用RegisterExceptionHandler。