AGB  ·  Datenschutz  ·  Impressum  







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

finally - Code aufrufen

Ein Thema von Flips · begonnen am 12. Jan 2008 · letzter Beitrag vom 12. Jan 2008
Antwort Antwort
Flips

Registriert seit: 17. Feb 2005
Ort: Sankt Wendel
491 Beiträge
 
Delphi 7 Professional
 
#1

finally - Code aufrufen

  Alt 12. Jan 2008, 14:42
Hi,

folgender Code:
Delphi-Quellcode:
try
  ausgabe := 0;
  if eingabe = 0 then
    raise Exception.Create('Eingabe darf nicht 0 sein');
  ausgabe := zahl + eingabe;
finally
  ShowMessage(IntToStr(ausgabe));
end;
So, nehmen wir an ich gebe jetzt 0 ein, dadurch wird die Exception ausgelöst. Springt Delphi nach der Exception direkt in den finally Teil oder führt es den Code weiter aus?
Wenn es den Code weiter ausführt, gelingt mir ein Sprung dann nur mit einem except-Teil?


Natürlich könnte ich auch einfach schreiben:
Delphi-Quellcode:
if eingabe = 0 then
  begin
    raise Exception.Create('Eingabe darf nicht 0 sein');
    Exit;
  end;
Springt es dann auch noch in den finally Teil bevor es die Methode verlässt?

Thx
Philipp F.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: finally - Code aufrufen

  Alt 12. Jan 2008, 14:44
Es hupft sofort in den nächsten Finally-Block, oder in den nächsten Except-Block.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Flips

Registriert seit: 17. Feb 2005
Ort: Sankt Wendel
491 Beiträge
 
Delphi 7 Professional
 
#3

Re: finally - Code aufrufen

  Alt 12. Jan 2008, 14:47
Sowohl bei Exit als auch bei ner manuellen Exception?
Philipp F.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: finally - Code aufrufen

  Alt 12. Jan 2008, 14:49
Also, das exit nach dem raise Exception brauchst du nicht, da kommt das Programm nie hin.

Unabhängig davon springt aber ein Exit auch in den Finally-Block. In einen Finally-Block setzt man i.A. Variablen zurück und gibt Speicher frei.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Flips

Registriert seit: 17. Feb 2005
Ort: Sankt Wendel
491 Beiträge
 
Delphi 7 Professional
 
#5

Re: finally - Code aufrufen

  Alt 12. Jan 2008, 15:02
Ok, danke dir für die schnelle und kompetente Hilfe
Philipp F.
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#6

Re: finally - Code aufrufen

  Alt 12. Jan 2008, 15:28
mal davon abgesehen, solltest du solche konstrukte vermeiden. raise und exception nur wenn es gar nicht anders geht. ist eigentlich ein systemübergreifender goto nur noch schlimmer!
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: finally - Code aufrufen

  Alt 12. Jan 2008, 16:21
Zitat von grenzgaenger:
mal davon abgesehen, solltest du solche konstrukte vermeiden. raise und exception nur wenn es gar nicht anders geht. ist eigentlich ein systemübergreifender goto nur noch schlimmer!
Warum denn. Ist klar, dass es in dem Beispiel nicht sinvoll ist. Aber ich denke, de rOP hat sein eigentliches Problem hier nur vereinfacht dargestellt. Und try..Finally setzt dein Compiler in jeder Funktion, in der du dynamische Variablen verwendest
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#8

Re: finally - Code aufrufen

  Alt 12. Jan 2008, 16:25
try
finally
end


ist ja ok. da ist ja nix gegen zu sagen, im gegenteil . meine kritik ging an die exeptions mit raise... das ist es was man vermeiden sollte und nur in wirklichen notfällen, wenn es keine andere möglichkeit gibt, einsetzen sollte.

wünsch dir noch einen schönen abend.
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#9

Re: finally - Code aufrufen

  Alt 12. Jan 2008, 16:27
Zitat von grenzgaenger:
mal davon abgesehen, solltest du solche konstrukte vermeiden. raise und exception nur wenn es gar nicht anders geht. ist eigentlich ein systemübergreifender goto nur noch schlimmer!
Da bin ich anderer Meinung. Exceptions sind gerade dazu da, damit man sich nicht drum kümmern muss, was jetzt alles nicht mehr ausgeführt werden darf. Und das was ausgeführt werden muss, steht eh im finally. Genau das ist doch der Sinn von exceptions: Sich auf einfache Weise aus einer Ausnahmesituation ui retten. Damit braucht man die ganzen fehleranfälligen, unpraktischen und schlecht erweiterbaren Fehlercodes nicht mehr, etc.

Mal n paar Hinweise an denen man IMHO überprügfen kann, ob man Exceptions richtig einsetzt:
- Exceptions nur in inneren Klassen; nicht in Formularklassen
- solche spätetens in dn Formularklassen wieder fangen (in manchen - eher seltenen - Fällen macht es auch Sinn dies früher zu tun)
- trotzdem immer versuchen, dass die Ausnahmesituation gar nicht erst auftritt(Beispiel: mit FileExists prüfen, statt den fehler im except abfangen)
- in den finally-Block nur zum freigeben: Free, FreeMem, FreeAndnil
- in den except-Block nix, was wieder ne Exeption auslösen könnte
- ggf. nach Fehlerklassen unterscheiden ==> on
- für ne eigene Klassen auch eigene Fehlerklassen schreiben. nicht exception direkt benutzen
- wenn es schon eine passende Fehlerklasse gibt, nicht noch eine schreiben
- der Exception alle benötoigen Infos mitgeben
- ...

mfg

Christian

P.S.: Zum eigentlichen Problem: Gibt es irgend einen Grund, warum du es nicht einfach ausprobierst bzw. ausporobiert hast?
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:38 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