Why Application.OnException never runs?

758 views Asked by At

Problem summary: The method assigned to Application.OnException never runs when an unhandled exception occurs.

I create a blank project with only this unit and place a single button on Unit.dfm (this is based on an 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;

Then I set a breakpoint inside TForm1.AppException(). I run the program, click the button, an error dialog is shown saying "Incorrect password entered" but if I continue execution the breakpoint never breaks; the program doesn't Terminate like I asked it too. The program continues running and I can press the button again.

I tried the same code (adapted) in Delphi 7 but the same result is encountered.

2

There are 2 answers

0
David Heffernan On BEST ANSWER

The only rational explanation is the FormCreate is not executing. You need to assign it to the form's OnCreate event handler. Use the object inspector to do so.

0
fullerm On

If you are using a third party exception handler such as madExcept, Application.OnException will no longer fire. You must instead follow the third party's advice. For madExcept you must code TMadExceptionHandler.OnException event or directly call RegisterExceptionHandler.