Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Nur bestimmte exceptions abfangen/ignorieren (https://www.delphipraxis.net/205001-nur-bestimmte-exceptions-abfangen-ignorieren.html)

kagi3624 22. Jul 2020 12:07

Delphi-Version: 6

Nur bestimmte exceptions abfangen/ignorieren
 
Hallo, ich möchte eine bestimmte Exception abfangen bzw. ignorieren. Gibt es irgendeinen Befehl ähnlich zu continue oder so, dass mein Programm dann einfach weitermacht?

Code:
  try
   blablub(iwas);
  except
   On E : Exception do
    if (E.ClassName = 'EIBInterBaseError') then
        -> ignorieren ??
    else
      raise Exception.Create(E.Message);
  end;

DeddyH 22. Jul 2020 12:32

AW: Nur bestimmte exceptions abfangen/ignorieren
 
Delphi-Quellcode:
try
  MachWas;
except
  on E: EIrgendwasException do
    BehandleEIrgendwasException;
  on E: EWasAnderesException do
    BehandleEWasAnderesAxception;
  on E: Exception do
    BehandleAnderenExceptionTyp;
end;

kagi3624 22. Jul 2020 12:38

AW: Nur bestimmte exceptions abfangen/ignorieren
 
Ja, ich kann aber keine Exceptions ignorieren, habe ich grade erfahren. Wäre ja auch zu schön des guten :cyclops:

Jasocul 22. Jul 2020 13:01

AW: Nur bestimmte exceptions abfangen/ignorieren
 
Wenn man folgendes programmiert:
Code:
  try
   blablub(iwas);
  except
  end;
wird jede Exception ignoriert.

Ohne zu testen gehe ich davon aus, dass dieses Konstrukt dann deine Bedingung erfüllt:
Code:
  try
   blablub(iwas);
  except
   On E : Exception do
    if (E.ClassName <> 'EIBInterBaseError') then
      raise Exception.Create(E.Message);
  end;

DeddyH 22. Jul 2020 13:01

AW: Nur bestimmte exceptions abfangen/ignorieren
 
Wieso?
Delphi-Quellcode:
// Fangen und nicht behandeln
on E: EMirEgalException do;
Ob das ratsam ist, hängt vom Einzelfall ab. In der IDE wird die Exception beim Debuggen trotzdem geworfen.

himitsu 22. Jul 2020 13:30

AW: Nur bestimmte exceptions abfangen/ignorieren
 
Erstens niemals nicht über den Namen vegleichen.
Nachteil ist auch, dass der Name/Typ so nicht vom Compiler geprüft wird.

Delphi-Quellcode:
try
  ...
except
  on E: Exception do
    if E is EIBInterBaseError then
      // nicht machen
    else
      raise;
end;
Delphi-Quellcode:
try
  ...
except
  on E: Exception do
    if not (E is EIBInterBaseError) then
      raise;
end;
oder wie bereits gezeigt
Delphi-Quellcode:
try
  ...
except
  on E: EIBInterBaseError do
    ; // nichts
  on E: Exception do
    raise;
end;
Zitat:

Delphi-Quellcode:
raise Exception.Create(E.Message);

Und wer das macht, wird auch gesteinigt.

Denn rate mal was hier passiert.
Delphi-Quellcode:
try
  try
    raise EIBInterBaseError.Create('peng');
  except
    on E: Exception do
      raise Exception.Create(E.Message); // das Böse, wo der Typ sinnlos vernichtet wird ud Informationen verloren gehen
  end;
except
  on E: EIBInterBaseError do
    ShowMessage('juhu');
  on E: Exception do
    raise Exception.Create('Danke (sarkastisch)'); // oder ShowMessage mit ganz bösem Icon
end;

kagi3624 22. Jul 2020 14:23

AW: Nur bestimmte exceptions abfangen/ignorieren
 
Zitat:

Zitat von himitsu (Beitrag 1470093)
Erstens niemals nicht über den Namen vegleichen.
Nachteil ist auch, dass der Name/Typ so nicht vom Compiler geprüft wird.

Delphi-Quellcode:
try
  ...
except
  on E: Exception do
    if E is EIBInterBaseError then
      // nicht machen
    else
      raise;
end;
Delphi-Quellcode:
try
  ...
except
  on E: Exception do
    if not (E is EIBInterBaseError) then
      raise;
end;
oder wie bereits gezeigt
Delphi-Quellcode:
try
  ...
except
  on E: EIBInterBaseError do
    ; // nichts
  on E: Exception do
    raise;
end;

Ja, wäre schön, wenn Delphi 6 das könnte. Ich bekomme *dies und das ist unbekannt, das und dies kannste aber nich machen hier* wenn ich es so mache, ich glaube um einen Vergleich über namen komme ich nicht umher, aber das einfache raise; geht!

DeddyH 22. Jul 2020 14:41

AW: Nur bestimmte exceptions abfangen/ignorieren
 
Nenn doch mal die genauen Fehlermeldungen, wahrscheinlich musst Du nur weitere Units einbinden.

kagi3624 22. Jul 2020 15:02

AW: Nur bestimmte exceptions abfangen/ignorieren
 
Zitat:

Zitat von DeddyH (Beitrag 1470104)
Nenn doch mal die genauen Fehlermeldungen, wahrscheinlich musst Du nur weitere Units einbinden.

bei
Code:
if not (E is EIBInterBaseError) then
[Fehler] bla.pas(442): Undefinierter Bezeichner: 'EIBInterBaseError'

Dalai 22. Jul 2020 15:03

AW: Nur bestimmte exceptions abfangen/ignorieren
 
Also ich hab grad alle drei Varianten im Delphi 5 probiert, und alle lassen sich selbst dort einwandfrei nutzen. Statt EIBInterBaseError hab ich EConvertError eingesetzt, denn es geht ja nur ums Prinzip. Oder anders gesagt: Setze die für deinen Code passenden Exception-Typen ein.

Grüße
Dalai

himitsu 22. Jul 2020 15:05

AW: Nur bestimmte exceptions abfangen/ignorieren
 
Ich bin mir fast sicher dass selbst D6, und noch viel älter, bis bestimmr mindestens Turbo Pascal, all diese Syntaxen verstehen sollte.

Abgesehn von dem Beispiel-Typ, wo vielleicht nur die Unit fehlt, aber sieht du wie gut eine Syntaxprüfung ist, wenn der Name nicht als String vorkommt. :zwinker: :angle:

DeddyH 22. Jul 2020 15:07

AW: Nur bestimmte exceptions abfangen/ignorieren
 
Wenn man nun noch die Unit einbindet, in der der entsprechende Exception-Typ deklariert ist, dann funktioniert das auch.

Uwe Raabe 22. Jul 2020 15:09

AW: Nur bestimmte exceptions abfangen/ignorieren
 
Zitat:

Zitat von himitsu (Beitrag 1470093)
Delphi-Quellcode:
try
  ...
except
  on E: EIBInterBaseError do
    ; // nichts
  on E: Exception do
    raise;
end;

Warum so kompliziert?
Delphi-Quellcode:
try
  ...
except
  on E: EIBInterBaseError do
    ; // nichts
end;
Solange der except-Block nicht ganz leer ist, wird alles was nicht explizit behandelt wird einfach weitergereicht.

dummzeuch 22. Jul 2020 17:41

AW: Nur bestimmte exceptions abfangen/ignorieren
 
Zitat:

Zitat von himitsu (Beitrag 1470111)
Ich bin mir fast sicher dass selbst D6, und noch viel älter, bis bestimmr mindestens Turbo Pascal, all diese Syntaxen verstehen sollte.

Da es Exceptions erst ab Delphi gibt (war es Delphi 2? Ich glaube in 16 Bit Windows gab es sie noch nicht, also nicht in Delphi 1), wage ich das mal zu bezweifeln. ;-)

Aber im Prinzip hast Du recht: Jedes Delphi sollte diese Syntax verstehen.

Uwe Raabe 22. Jul 2020 18:11

AW: Nur bestimmte exceptions abfangen/ignorieren
 
Zitat:

Zitat von dummzeuch (Beitrag 1470127)
Da es Exceptions erst ab Delphi gibt (war es Delphi 2? Ich glaube in 16 Bit Windows gab es sie noch nicht, also nicht in Delphi 1), wage ich das mal zu bezweifeln. ;-)

Exceptions gab es wohl auch schon in Delphi 1, wie man diesem Artikel von Allen Bauer entnehmen kann:
Zitat:

I remember cringing when Anders Hejlsberg demoed the exception handling capabilities by dereferencing a nil pointer. I had done all the work to map the hardware exceptions (via. the Windows 3.x toolhelp.dll) into language exceptions. Windows 3.x at the time had no OS supported exception mechanism. Remember all those “General Protection Fault” dialogs? brrrrr...
Auch nett der Kommentar von Nick Hodges:
Zitat:

When Anders referenced that nil PChar, there was a literal hush in the room, and when it didn't crash, putting up an exception instead, the place went crazy.

The MS people in the back were carried out on stretchers, I think from hyperventilating. ;-)

himitsu 22. Jul 2020 18:24

AW: Nur bestimmte exceptions abfangen/ignorieren
 
Jo, ab Delphi 2 ist es 32 Bit
und ab WinNT gab es dann nochmal einen größeren Sprung, wo sich nach 9x/ME nochmal alles änderte, vor allem in der Speicherveraltung.

Ich geb zu, meine kurzen Ausflüge vorm Delphi ins TurboPascal/DOS ... da hatte ich auf sowas wie Fehlerbehandlung noch garnicht geachtet (wusste noch nichtmal was das ist :oops:)
Aber ich hätte schon erwartet, dass es zumindestens im 32-Bit-Windows bereits Exceptions gab, inkl. Try-Finally/Except, fast so ähnlich wie heute.

kagi3624 23. Jul 2020 07:26

AW: Nur bestimmte exceptions abfangen/ignorieren
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1470113)
Zitat:

Zitat von himitsu (Beitrag 1470093)
Delphi-Quellcode:
try
  ...
except
  on E: EIBInterBaseError do
    ; // nichts
  on E: Exception do
    raise;
end;

Warum so kompliziert?
Delphi-Quellcode:
try
  ...
except
  on E: EIBInterBaseError do
    ; // nichts
end;
Solange der except-Block nicht ganz leer ist, wird alles was nicht explizit behandelt wird einfach weitergereicht.

Ok, ich hab die pas gefunden wo diese Errordifinition steht, jetzt funktioniert es.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:43 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 by Thomas Breitkreuz