Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Eine Frage zu raise-Anweisung (https://www.delphipraxis.net/179803-eine-frage-zu-raise-anweisung.html)

Popov 2. Apr 2014 21:30

Eine Frage zu raise-Anweisung
 
Ich hab eine Prozedur, aus der ich eine Funktion aufrufe, die wiederum eine Funktion aufruft. In dieser (zweiten) Funktion löse ich u. U. eine Exception aus. Ab da wird diese zweite Funktion natürlich unterbrochen und nach meinem Verständnis wird das fortgeführt bis zum ersten Aufruf (dazwischen wird die Fehlermeldung nicht abgefangen).

Nun ist es so, dass die zweite Funktion komplett unterbrochen wird, aber bei der ersten Funktion springt Delphi lediglich auf die letzte Zeile, d. h. diese Zeile wird noch ausgeführt. Bei der Prozedur wird auch noch eine Zeile ausgeführt.

Also entweder ich verstehe Exceptions falsch oder das ist nicht normal.

Ich würde den Code gerne hier veröffentlichen, ist aber zu groß. Reduziert auf das nötigste passiert das nicht und die Funktionen brechen normal ab.

Sir Rufo 2. Apr 2014 22:15

AW: Eine Frage zu raise-Anweisung
 
Bist du dir sicher, dass diese Zeile noch ausgeführt wird oder ist es nur, dass der Debugger auf der Zeile stehenbleibt?

Teilweise ist die DebuggerAnzeige nicht korrekt => Projekt erzeugen lassen.

Ein ShowMessage am Ende sollte da Klarheit bringen.

Der schöne Günther 2. Apr 2014 22:16

AW: Eine Frage zu raise-Anweisung
 
Du hast es schon richtig verstanden. Was dich (wie mich anfangs auch) aus den Trab bringt ist die Tatsache, dass die IDE eine Zeile zu tief rot markiert. (Und zwar immer. Das hat nichts mit fehlerhaft kodierten Zeilenumbrüchen zu tun, auch wenn man es oft hört) Ausgeführt wird da nichts mehr.

Das sieht man auch links im Stack-Fenster "Aufrufreihenfolge". Intuitiv wäre es, wenn die Zeile darüber rot angemalt werden würde, denn dieser Aufruf hat ja die Exception geworfen.

Sir Rufo 2. Apr 2014 22:22

AW: Eine Frage zu raise-Anweisung
 
Nun ja, ob da wirklich zu tief markiert wird ist Ansichtssache.

Die Zeile die markiert ist wird beim nächsten Step - wenn keine Exception/Programmabbruch dazwischenkommt - ausgeführt.

Unter der Prämisse ist die Markierung also korrekt ;)

Setze einen Haltepunkt im Code und starte das Programm. Am Haltepunkt wird gestoppt, die Zeile ist markiert, aber noch nicht ausgeführt.

Popov 2. Apr 2014 22:49

AW: Eine Frage zu raise-Anweisung
 
Jetzt ist es weg, bzw. nicht mehrt in der Form da. Der Zeiger springt zwar immer noch auf die letzte Zeile in der Funktion, übernimmt aber anscheinend nicht mehr den Wert (es war Result). Auch in der Prozedur wird jetzt nichts mehr ausgeführt.

Das mit der ShowMessage habe ich auch gemacht, die wurde auch ausgeführt.

Jetzt ist alles wieder normal. Sonderbar.

sx2008 2. Apr 2014 22:51

AW: Eine Frage zu raise-Anweisung
 
Am Ende jeder Procedur/Funktion gibt es einen unsichtbaren Bereich der zur Finalisierung benützt wird.
Dort wird z.B. bei Strings und Interfacezeigern der Referenzzähler erniedrigt und der String bzw. das Interface ggf. freigegeben.
Im Debugger lässt sich das nicht richtig darstellen weshalb es so scheint als würde die letzte Zeile ausgeführt.

Popov 2. Apr 2014 22:57

AW: Eine Frage zu raise-Anweisung
 
Gut, das ist die Erklärung für jetziges Verhalten. Vor einer Stunde wurde die letzte Zeile ausgeführt.

Dejan Vu 3. Apr 2014 07:24

AW: Eine Frage zu raise-Anweisung
 
Zitat:

Zitat von Popov (Beitrag 1254500)
Vor einer Stunde wurde die letzte Zeile ausgeführt.

Dann darfst Du halt zwischen 21:00 und 22:00 nicht mehr debuggen. :stupid:

Blup 3. Apr 2014 08:11

AW: Eine Frage zu raise-Anweisung
 
Wenn der Quellcode nicht mehr mit der gelinkten dcu-Datei übereinstimmt sind solche Effekte zu beobachten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:15 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