[gelöst] Eigenen ExceptionHandler erstellen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
FrankS
Beiträge: 9
Registriert: Mi 26. Jan 2022, 18:55

[gelöst] Eigenen ExceptionHandler erstellen

Beitrag von FrankS »

Hallo,
ich bin am verzweifeln.
Ich möchte einen eigenen ExceptionHandler erstellen und stoße dabei nur auf Probleme:
Meine Konfiguration ist folgende:
Windows 10
Laazarus 2.0.12
FPC 3.2.0


Folgendes habe ich diverse Male als Lösung im Internet gefunden.
Probleme:
Exception in Button1Click aufgerufen -> Es wird der Debugger.- und SytemHandler und nicht der von mir definierte aufgerufen.
Exception in Timer1Timer aufgerufen -> Es wird nur der DebuggerHandler aufgerufen.

Code: Alles auswählen

program project1;

{$mode objfpc}{$H+}

uses
    {$IFDEF UNIX}{$IFDEF UseCThreads}
    cthreads,
    {$ENDIF}{$ENDIF}
    Interfaces, // this includes the LCL widgetset
    Forms, Unit1
    { you can add units after this };

{$R *.res}

begin
    RequireDerivedFormResource:=True;
    Application.Scaled:=True;
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    try
        Application.Run;
    except
    end;
end.

Code: Alles auswählen

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
    Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls;

type

    { TForm1 }

    TForm1 = class(TForm)
        Button1: TButton;
        Timer1: TTimer;
        procedure OnError(Sender: TObject; E: Exception);
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
    private

    public
    end;

var
    Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
    Application.OnException := @OnError;
end;

procedure TForm1.OnError(Sender: TObject; E: Exception);
begin
  ShowMessage('HALLO' + E.Message);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
    raise Exception.Create('**** Btn1 ****');
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
    Timer1.Enabled:=false;
    raise Exception.Create('**** Timer1 ****');
end;

end.
Wenn ich jetzt TForm1 ein TApplicationProperties hinzufüge und diesem über den Objectinspektor OnException = OnError zuweise habe ich folgendes Verhalten:
Exception in Button1Click aufgerufen -> Es wird der Debugger.- und der von mir definierte aufgerufen.
Exception in Timer1Timer aufgerufen -> Es wird nur der DebuggerHandler aufgerufen.


Warum benötige ich TApplicationProperties?
Was muss getan werden damit die Exception aus Timer1Timer "gefangen wird"?

Gruß
Frank
Zuletzt geändert von FrankS am Di 1. Aug 2023, 09:09, insgesamt 1-mal geändert.

sstvmaster
Beiträge: 576
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Eigenen ExceptionHandler erstellen

Beitrag von sstvmaster »

Hallo Frank,

wie ich sehe hast du aber noch keinen eigene Exception Klasse erstellt.

Beispiel findest du hier: https://wiki.freepascal.org/Exceptions# ... t_problems

und hier: https://stackoverflow.com/questions/169 ... in-lazarus
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

FrankS
Beiträge: 9
Registriert: Mi 26. Jan 2022, 18:55

Re: Eigenen ExceptionHandler erstellen

Beitrag von FrankS »

Ein Update auf Lazarus 2.2.6 hat das Problem behoben.

Antworten