Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Datenbankfehler Programm bleibt im Speicher (https://www.delphipraxis.net/217116-datenbankfehler-programm-bleibt-im-speicher.html)

HCB 30. Apr 2025 11:32

Datenbank: Access • Version: 2003 • Zugriff über: FireDac

Datenbankfehler Programm bleibt im Speicher
 
Hallo,
ich habe festgestellt, dass wenn eine Exception ausgelöst wird, das Programm im Speicher verweilt. Eine neue Compilierung ist nicht möglich. Es muss erst über den Taskmanager das Programm beendet werden. Folgende Routine habe ich:
Delphi-Quellcode:
try
    DataMod.T_ABFBaum.Open;
    DataMod.Q_ArtLief.Open;
    DataMod.T_ArtMenge.Open;
    DataMod.Q_StckList.Open;
    DataMod.T_ArtMenge_StckList.Open;
    DataMod.Q_Hersteller.Open;
  except
    on E: Exception do raise Exception.Create('Fehler beim Öffnen der Tabellen!');
  end;
Wenn also die Exception aus irgendeinen Grund ausgelöst wird, sollte doch der Speicher freigegeben werden.

Kann man das irgendwo einstellen? Im MainForm ist im FormCreate-Ereignis
Delphi-Quellcode:
 ReportMemoryLeaksOnShutdown := True;
eingetragen.

Wie kann ich sicherstellen, dass IMMER der Speicher freigegeben wird, auch wenn sonst das Programm an anderer Stelle abstürzt?

Hat jemand eine Idee und kann mir helfen?

LG Harry

Andreas13 30. Apr 2025 11:38

AW: Datenbankfehler Programm bleibt im Speicher
 
Hallo,

würde das so nicht funktionieren?
Delphi-Quellcode:
...
  except
    on E: Exception do
    Begin
      raise Exception.Create('Fehler beim Öffnen der Tabellen!');
      DataMod.T_ABFBaum.Destroy;
      DataMod.Q_ArtLief.Destroy;
      DataMod.T_ArtMenge.Destroy;
      DataMod.Q_StckList.Destroy;
      DataMod.T_ArtMenge_StckList.Destroy;
     DataMod.Q_Hersteller.Destroy;
  End;
end;

HCB 30. Apr 2025 11:51

AW: Datenbankfehler Programm bleibt im Speicher
 
Der Ausführungsbereich nach
Delphi-Quellcode:
except
    on E: Exception do raise Exception.Create('Fehler beim Öffnen der Tabellen!');
    begin
    ....
    end;
wird ja dann nicht mehr ausgeführt.

Andreas13 30. Apr 2025 11:57

AW: Datenbankfehler Programm bleibt im Speicher
 
ich habe meinen ersten Code vor einiger Zeit korrigiert... So müßte es funktionieren:
Delphi-Quellcode:
  except
    on E: Exception do
   Begin
    raise Exception.Create('Fehler beim Öffnen der Tabellen!');
    DataMod.T_ABFBaum.Destroy;
    DataMod.Q_ArtLief.Destroy;
    DataMod.T_ArtMenge.Destroy;
    DataMod.Q_StckList.Destroy;
    DataMod.T_ArtMenge_StckList.Destroy;
    DataMod.Q_Hersteller.Destroy;
  End;
end;

dataspider 30. Apr 2025 12:19

AW: Datenbankfehler Programm bleibt im Speicher
 
Zitat:

Zitat von HCB (Beitrag 1548373)
Der Ausführungsbereich nach
Delphi-Quellcode:
except
    on E: Exception do raise Exception.Create('Fehler beim Öffnen der Tabellen!');
    begin
    ....
    end;
wird ja dann nicht mehr ausgeführt.

Aber wenn du noch ein try finally drumrum baust, wird der Code in finally noch ausgeführt.


Delphi-Quellcode:
try
  try
    // Machen
  except
    // Fehlerbehandlung
  end;
finally
  // Bereinigen
end;
Warum du allerdings beim Fehler die Querys und dazu noch mit Destroy zerstören willst, erschliesst sich mir nicht...

Frank

Uwe Raabe 30. Apr 2025 12:26

AW: Datenbankfehler Programm bleibt im Speicher
 
Ich verstehe nicht, warum du die Information der eigentlichen Exception ignoriert und durch eine unspezifische Exception mit einer ebensolchen Meldung ersetzen willst. Wenn du unbedingt die Fehlermeldung ändern willst, dann kann man das auch direkt tun.

Aber unabhängig davon, bleiben die DataSets bei einer Exception erstmal offen. Da ich annehme, dass ohne die Exception die DataSets an anderer Stelle korrekt geschlossen werden, sollte es genügen dies bei der Exception ebenso zu tun:
Delphi-Quellcode:
 
  try
    DataMod.T_ABFBaum.Open;
    DataMod.Q_ArtLief.Open;
    DataMod.T_ArtMenge.Open;
    DataMod.Q_StckList.Open;
    DataMod.T_ArtMenge_StckList.Open;
    DataMod.Q_Hersteller.Open;
  except
    on E: Exception do begin
      DataMod.Q_Hersteller.Close;
      DataMod.T_ArtMenge_StckList.Close;
      DataMod.Q_StckList.Close;
      DataMod.T_ArtMenge.Close;
      DataMod.Q_ArtLief.Close;
      DataMod.T_ABFBaum.Close;
      E.Message := 'Fehler beim Öffnen der Tabellen!';
      raise; // Hier bleibt wenigstens die Exception-Klasse unverändert.
    end;
  end;
Und ja, jeglicher Code nach raise wird nicht ausgeführt. Man erkennt das im Editor auch an dem kleinen Pfeil.

HCB 30. Apr 2025 15:25

AW: Datenbankfehler Programm bleibt im Speicher
 
Ok, danke an alle für die Unterstützung.
LG Harry


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz