AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Except-Block manuell auslösen

Ein Thema von Captnemo · begonnen am 16. Jul 2014 · letzter Beitrag vom 16. Jul 2014
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#1

Except-Block manuell auslösen

  Alt 16. Jul 2014, 08:35
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.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo

Geändert von Captnemo (16. Jul 2014 um 08:37 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#2

AW: Except-Block manuell auslösen

  Alt 16. Jul 2014, 08:38
Suchst Du evtl. raise?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#3

AW: Except-Block manuell auslösen

  Alt 16. Jul 2014, 08:45
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.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Except-Block manuell auslösen

  Alt 16. Jul 2014, 08:51
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#5

AW: Except-Block manuell auslösen

  Alt 16. Jul 2014, 08:54
Ist es nicht so, dass wenn eine Exception in einer Funktion auftritt, dass die Procedure in der diese Funktion aufgerufen wurde weiter durchlaufen wird?
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Except-Block manuell auslösen

  Alt 16. Jul 2014, 08:57
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)
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#7

AW: Except-Block manuell auslösen

  Alt 16. Jul 2014, 08:59
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Except-Block manuell auslösen

  Alt 16. Jul 2014, 09:22
Kann mir mal wer sagen, warum man in einem try .. except aufräumt?
Ich dachte immer, dass macht man mit so einem try .. finally und wenn man dort ein Exit aufruft, wird trotzdem noch der finally Block besucht.

Delphi-Quellcode:
try
  if not foo() then Exit;
  if not bar() then Exit;
  DoFooBar;
finally
  DoCleanUp; // wird immer aufgerufen!
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.080 Beiträge
 
Delphi 12 Athens
 
#9

AW: Except-Block manuell auslösen

  Alt 16. Jul 2014, 09:35
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 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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#10

AW: Except-Block manuell auslösen

  Alt 16. Jul 2014, 09:47
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 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 except -Block verwenden, der alle Exceptions abfängt. Bei Exceptions wie EOutOfMemory oder EApocalypse sollte man vielleicht etwas anders reagieren als bei einer 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 finally -Block.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:37 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