Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Fehlermeldung korrekt ausgeben (https://www.delphipraxis.net/161068-fehlermeldung-korrekt-ausgeben.html)

martin_ 15. Jun 2011 09:35

Delphi-Version: 2010

Fehlermeldung korrekt ausgeben
 
Hallo,
habe folgenden Code und möchte eine Fehlermeldung ausgeben:
Delphi-Quellcode:
   
var
  o : TObject;
begin
try
  try
    o.Create;
  except
    ShowMessage('error');
  end;
finally
  FreeAndNil(o);
end;
Im Debugger erscheinen die Debugger Exceptions. Starte ich die Exe erscheint zuerst mein ShowMessage "error" und später eine Zugriffsverletzung bei Adresse .. in Modul ..;
Wie bekomme ich die letzte Meldung weg? Da der Fehler bereits abgefangen wurde, möchte ich die Nachricht nicht anzeigen.

blackfin 15. Jun 2011 09:37

AW: Fehlermeldung korrekt ausgeben
 
Die Zugriffsverletzung, die du beschreibst, kommt nicht vom ersten Fehler innerhalb des except-Blocks, sondern vom Freigeben des nicht erzeugten Objekts danach!
Erklärung:
Die Statements im finally-Block werden immer ausgeführt, also auch dann, wenn dein create() fehlschlägt.
Somit knallt es dann auch dort nochmal, weil dein "o"-Objekt an der Stelle nicht erzeugt wurde, du es aber freigeben willst.

Also entweder so:
Delphi-Quellcode:
var
  o : TObject;
begin
try
  try
    o := TObject.Create;
    FreeAndNil(o);
  except
    ShowMessage('error');
  end;
end;
oder so:
Delphi-Quellcode:
   
var
  o : TObject;
begin
try
  try
    o := TObject.Create;
  except
    ShowMessage('error');
  end;
finally
  if assigned(o) then FreeAndNil(o);
end;
oder mit ausführlicher Fehlermeldung:
Delphi-Quellcode:
var
  o : TObject;
begin
try
  try
    o := TObject.Create;
  except
    on E : Exception do
      ShowMessage('Error ['+ E.ClassName+']: '+ E.Message);
  end;
finally
  if assigned(o) then FreeAndNil(o);
end;

mkinzler 15. Jun 2011 09:43

AW: Fehlermeldung korrekt ausgeben
 
Es muss
Delphi-Quellcode:
o := TObject.Create;
heissen.

Zudem wird beim Fehler im Konstruktor kein Objekt erzeugt, so brauchst du dieses dann auch nicht mehr Freigeben
Bei lokalen Variablen würde dann auch .Free reichen

DeddyH 15. Jun 2011 10:02

AW: Fehlermeldung korrekt ausgeben
 
Eine Assigned-Abfrage vor einem Free(AndNil) ist BTW überflüssig, da Free intern selbst auf Assigned prüft.

martin_ 15. Jun 2011 10:12

AW: Fehlermeldung korrekt ausgeben
 
Danke. Dann war meine todsichere Methode für einen "künstlichen" Fehler mit o.create falsch.

Deep-Sea 15. Jun 2011 10:13

AW: Fehlermeldung korrekt ausgeben
 
Wieso nicht einfach in der Form?!
Delphi-Quellcode:
begin
  try
    // Erzeugen
    try
      // Das tun, was man tun will
    finally
      // Freigeben
    end;
  except
    // Fehler behandeln
  end;
end;

himitsu 15. Jun 2011 10:22

AW: Fehlermeldung korrekt ausgeben
 
Zitat:

Zitat von Deep-Sea (Beitrag 1106489)
Wieso nicht einfach in der Form?!

Richtig, denn das Create kommt vor das Try, da damit die Variable geschützt wird, welche erst mit erfolgreiche, Abschluß des Create ordnungsgemäß gesetzt ist.

Ressourcenschutzblock:
Delphi-Quellcode:
// Erzeugen
try
  // Das tun, was man tun will
finally
  // Freigeben
end;
Ressourcenschutzblock mit Exceptionbehandlung:
Delphi-Quellcode:
try
  // Erzeugen
  try
    // Das tun, was man tun will
  finally
    // Freigeben
  end;
except
  // Fehler behandeln
end;
Ressourcenschutzblock mit Exceptionbehandlung und, im Except, mit möglichem Zugriff auf das Objekt:
Delphi-Quellcode:
// Erzeugen
try
  try
    // Das tun, was man tun will
  except
    // Fehler behandeln
  end;
finally
  // Freigeben
end;

Teekeks 15. Jun 2011 11:28

AW: Fehlermeldung korrekt ausgeben
 
Zitat:

Zitat von martin_ (Beitrag 1106488)
Danke. Dann war meine todsichere Methode für einen "künstlichen" Fehler mit o.create falsch.

Wenn du einfach nur einen Fehler erzeugen möchtest:
Delphi-Quellcode:
raise Exception.Create('Uhhh, Fehler!');


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

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