【问题标题】:Why Application.OnException never runs?为什么 Application.OnException 永远不会运行?
【发布时间】:2015-06-19 07:03:36
【问题描述】:

问题总结:分配给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 中尝试了相同的代码(已改编),但遇到了相同的结果。

【问题讨论】:

  • 在这里工作得很好
  • @DavidHeffernan 感谢您尝试代码。有什么想法可以调试为什么它没有发生在我身上吗?
  • 您的 FormCreate 事件处理程序是否与表单的 OnCreate 事件断开连接?请参阅对象检查器或表单的 .dfm。
  • 不知道。我会把Caption := 'Boo'; 放在AppException 中。也许代码运行但调试被破坏。但也许 FormCreate 没有运行。
  • @DavidHeffernan 我把Button1.Caption := 'Boo'; 放在那里,但遗憾的是按钮标题没有改变。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-01-18
      • 1970-01-01
      • 2012-05-29
      • 2022-11-26
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      • 2020-04-03
      • 1970-01-01
      相关资源
      最近更新 更多