![]() |
Except-Block manuell auslösen
Hi,
ich hab mal eine Frage die ggf. auch blödsinnig ist. Ich habe
Delphi-Quellcode:
TueDies und TueDas sind aber Funktion deren Rückgabewert entscheiden soll, ob ein weiteres Vorgehen Sinn macht.
Try
TueDies; TueDas; Except Aufräumen; End Also würde ich gerne sowas machen
Delphi-Quellcode:
Geht sowas überhaupt? Wenn ja, wie?
Try
if not TueDies then SpringeInExcept-Block; if not TueDas then SpringeInExcept-Block; Except Aufräumen; End Ich kann natürlich auch die ganze If's verschachteln, aber das würd ich gerne anders lösen. |
AW: Except-Block manuell auslösen
Suchst Du evtl. raise?
|
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. |
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. |
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?
|
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)
|
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; |
AW: Except-Block manuell auslösen
Kann mir mal wer sagen, warum man in einem
Delphi-Quellcode:
aufräumt?
try .. except
Ich dachte immer, dass macht man mit so einem
Delphi-Quellcode:
und wenn man dort ein Exit aufruft, wird trotzdem noch der
try .. finally
Delphi-Quellcode:
Block besucht.
finally
Delphi-Quellcode:
try
if not foo() then Exit; if not bar() then Exit; DoFooBar; finally DoCleanUp; // wird immer aufgerufen! end; |
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-Quellcode:
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.
raise EAbort.Create(...);
|
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:
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.
raise
Auf keinen Fall aber solltest du einen unkonditionierten
Delphi-Quellcode:
-Block verwenden, der alle Exceptions abfängt. Bei Exceptions wie
except
Delphi-Quellcode:
oder
EOutOfMemory
Delphi-Quellcode:
sollte man vielleicht etwas anders reagieren als bei einer
EApocalypse
Delphi-Quellcode:
-Exception.
EConvertError
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:
-Block.
finally
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:24 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