为什么Application.OnException永远不会运行?

时间:2015-06-19 07:03:36

标签: delphi exception-handling delphi-xe2 delphi-7

问题摘要:当发生未处理的异常时,分配给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中尝试了相同的代码(改编)但遇到了相同的结果。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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