Einzelnen Beitrag anzeigen

pixfreak

Registriert seit: 6. Jul 2007
112 Beiträge
 
Delphi XE3 Professional
 
#4

Re: Anfänger: Try&except Problem

  Alt 2. Mai 2010, 08:23
Zitat von RunningUp:
Ich bin ja Anfänger, und würde jetzt gerne wissen warum mein Except Block nicht ausgeführt wird.
Mir jetzt einen Code zu geben der funktioniert, hilft mir zwar dabei mein Programm zum laufen zu kriegen, der Lernfaktor ist aber nicht da.
Moin RunningUp,

warum funktioniert Deine if-Abrfrage mit dem try except Block nicht?.
Du baust die Abfrage ja ein, damit es in Deinem Programm zu keinem Problem kommt, wenn Du die Zahl durch null teilst. Normalerweise würde Dein Programm mit einem Laufzeitfehler beendet, nämlich "Division durch null". In dem Programm wird nun eine "Fehlerbehandlung" mit dem Namen EZeroDivide ausgelöst, die zur Anzeige des Fehlers führt.

Durch den try except Block sagst Du Deinem Compiler, dass in dem try Bereich vielleicht etwas nicht funktionieren oder schief laufen könnte, in Deinem Beispiel die Division durch null. Der except Block fängt die dort aufgeführten Fehler ab, bei der Version von Luckie genau die Division durch null. Wenn dieser Fehler auftritt, dann gibt er dem Label den Text mit, dass die Division nicht ging. Tritt allerdings kein Fehler auf (Division durch eine Zahl ungleich null), dann wird der except Block auch nicht ausgeführt.

Wenn Du in Deinem Programm nochmal genau nachsiehst, wird in Deinem try Block eine if-Abfrage durchgeführt. Die ist soweit korrekt, bzw. auch wenn hier eine Zahl null ist, tritt ja kein Fehler ein, es wird nur die Anweisung hinter dem then ausgeführt. Wenn die Bedingung falsch ist, also beide Zahlen ungleich null sind, dann wird der Befehl hinter dem then übersprungen. Aber ein Fehler, oder genauer eine Exception wird nicht nicht gefeuert und damit wird der except Block nicht durchlaufen.

Zur Lösung: Setze doch Deine Abfrage in eine if-then-else Konstruktion:
Delphi-Quellcode:
if (Zahl1 = 0) or (Zahl2 = 0) then
   Label5.Caption := 'Zahl 1 oder 2 ist 0, Division nicht möglich'
else
begin
   Ergebnis := Zahl1 / Zahl2;
   Label5.Caption := 'Division möglich, Ergebnis: ' + FloatToStrF (Ergebnis, FFNumber, 8, 2);
end;
Achte darauf, hinter der Zeile nach dem then kein Semikolon zu setzen (da falle ich immer wieder darauf rein... komme halt von C/C++). Der Block begin end hinter dem else ist nötig, weil Du mehr als eine Anweisung hast und die dadurch zusammen gefasst werden.

Die andere Variante wäre das Beispiel von Luckie.

Zitat:
Den Befehl " On E: EZeroDivide do " kenne auch Ich nicht, will ich momentan auch nicht kennen, ich möchte mit den Befehlen mein Programm realisieren die Ich bis jetzt kenne.
Das ist nichts anderes, als der Fehler, der beim teilen durch null auftritt. Und durch das On im except Block wird dieser Fehler abgefangen.

Zitat:
PS: Ich sagte ja das es da elegantere Lösungen gibt, Ich aber den Syntax anwenden will. If/elese kommt erst in nächsten Abschnitt
Hmm, ohne if/else oder das Abfangen einer Exception wird es schwer. Eine Möglichkeit wäre das setzen des Labels, dass es nicht geht und in der if-Abfrage prüfen, ob die Zahlen ungleich null sind. Wenn ja, dann das Label mit dem Ergebnis noch einmal überschreiben. Nicht schön, daher lese doch in Deinem Buch ruhig mal einen Abschnitt weiter und überdenke dann Dein Programm noch einmal. Ich denke, dass wird helfen.

Nur noch zur Logig: Luckie hat es bereits angesprochen, Du brauchst nur auf die Zahl2 zu achten, denn null kann durch irgendetwas außer null geteilt werden, was dann übrig bleibt...

Viel Text am Sonntagmorgen, hoffe ich konnte etwas Licht ins dunkle bringen.


VG Pixfreak
  Mit Zitat antworten Zitat