Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Except-Block manuell auslösen (https://www.delphipraxis.net/181101-except-block-manuell-ausloesen.html)

Captnemo 16. Jul 2014 07:35

Except-Block manuell auslösen
 
Hi,
ich hab mal eine Frage die ggf. auch blödsinnig ist.

Ich habe

Delphi-Quellcode:
Try
  TueDies;
  TueDas;
Except
  Aufräumen;
End
TueDies und TueDas sind aber Funktion deren Rückgabewert entscheiden soll, ob ein weiteres Vorgehen Sinn macht.

Also würde ich gerne sowas machen

Delphi-Quellcode:
Try
  if not TueDies then SpringeInExcept-Block;
  if not TueDas then SpringeInExcept-Block;
Except
  Aufräumen;
End
Geht sowas überhaupt? Wenn ja, wie?
Ich kann natürlich auch die ganze If's verschachteln, aber das würd ich gerne anders lösen.

DeddyH 16. Jul 2014 07:38

AW: Except-Block manuell auslösen
 
Suchst Du evtl. raise?

Captnemo 16. Jul 2014 07:45

AW: Except-Block manuell auslösen
 
Naja, eigentlich will ich ja keine Exception auslösen.

Hm..sagen wir in der Funktion TuDies tritt eine Exception auf, die kann ich ja dort behandeln, und eine Rückgabewert setzen. dann sollte meine aufrufender Block nicht weiter machen und aufräumen.
Oder die Exception in der TuDies-Funktion nicht angezeigt werden, aber im aufrufenden Block. Ich kommm aber grad nicht dahinter, wie ich das am Besten machen kann.

mkinzler 16. Jul 2014 07:51

AW: Except-Block manuell auslösen
 
Wenn Du dier Exception auslöst landest Du im except-Block und wenn Du diese dort dann behandelst ist diese dann erledigt.

Sonst müsstest Du den Code in eine Prozedur/Methode auslagern und diese im Block und auch im Exceptionhandler aufrufen.

Captnemo 16. Jul 2014 07:54

AW: Except-Block manuell auslösen
 
Ist es nicht so, dass wenn eine Exception in einer Funktion auftritt, dass die Procedure in der diese Funktion aufgerufen wurde weiter durchlaufen wird?

mkinzler 16. Jul 2014 07:57

AW: Except-Block manuell auslösen
 
Nein Du landest in Exceptionhandler mit dem kleinsten Scope, wenn der Fehler dort nicht behandelt wird ein Ebene höher; bis er behandelt wird oder die Laufzeit das Programm beendet ( wenn nicht behandelt wird)

DeddyH 16. Jul 2014 07:59

AW: Except-Block manuell auslösen
 
Spontan fällt mir da nur sowas ein:
Delphi-Quellcode:
OK := true;
try
  if not TueDies then
    OK := false
  else if not TueDas then
    OK := false
  else if not TueWasAnderes then
    OK := false;  
except
  BehandleException;
  OK := false;
end;
if not OK then
  Aufräumen;

Sir Rufo 16. Jul 2014 08:22

AW: Except-Block manuell auslösen
 
Kann mir mal wer sagen, warum man in einem
Delphi-Quellcode:
try .. except
aufräumt?
Ich dachte immer, dass macht man mit so einem
Delphi-Quellcode:
try .. finally
und wenn man dort ein Exit aufruft, wird trotzdem noch der
Delphi-Quellcode:
finally
Block besucht.

Delphi-Quellcode:
try
  if not foo() then Exit;
  if not bar() then Exit;
  DoFooBar;
finally
  DoCleanUp; // wird immer aufgerufen!
end;

himitsu 16. Jul 2014 08:35

AW: Except-Block manuell auslösen
 
Jupp, wenn man in den Exception-Block will, dann mit einer Exception.
Dafür kann man auch fertige Exceptions verwenden, wie z.B. Delphi-Referenz durchsuchenAbort für das
Delphi-Quellcode:
raise EAbort.Create(...);
Aber Code, der z.B. immer und absichtlich aufgerufen werden soll, gehört dort nicht rein, denn für's Aufräumen ist Try-Finally da.

Uwe Raabe 16. Jul 2014 08:47

AW: Except-Block manuell auslösen
 
Wenn in deiner Methode (TueDies, TueDas) eine Exception ausgelöst wird und diese dort auch in einem Exception-Block behandelt wird, dann gilt die Exception als erledigt und das Prrogramm läuft nach dem Exception-Block normal weiter - also auch in der aufrufenden Methode. Soweit hast du schon recht.

Du kannst aber als letzten Befehl in der Exception-Behandlung von TueDies und TueDas auch einfach ein
Delphi-Quellcode:
raise
aufrufen, dann wird die gerade behandelte Exception nochmal ausgelöst und der nächsthöhere except-Block ist mit der Behandlung dran. Dies ist die gängige Methode lokal auf eine Exception zu reagieren und trotzdem die Exception weiter nach oben zu leiten.

Auf keinen Fall aber solltest du einen unkonditionierten
Delphi-Quellcode:
except
-Block verwenden, der alle Exceptions abfängt. Bei Exceptions wie
Delphi-Quellcode:
EOutOfMemory
oder
Delphi-Quellcode:
EApocalypse
sollte man vielleicht etwas anders reagieren als bei einer
Delphi-Quellcode:
EConvertError
-Exception.

Dinge, die immer ausgeführt werden sollen - unabhängig davon ob eine Exception aufgetreten ist oder nicht - gehören (wie schon mehrfach erwähnt) in einen
Delphi-Quellcode:
finally
-Block.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:16 Uhr.
Seite 1 von 2  1 2      

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